Доступ к внешней базе данных с использованием класса wpdb в WordPress
У меня есть шаблон пользовательской страницы в WordPress, который полагается на внешнюю базу данных, и для этой цели используется класс wpdb.
Это мой код:
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<header class="entry-header">
<?php the_title( '<h1 class="entry-title">', '</h1>' ); ?>
</header><!-- .entry-header -->
<?php
class StudentsDatabase
{
private $db;
public function __construct() {
try {
$this->db = new wpdb(DB_USER, DB_PASSWORD, 'students_db', DB_HOST);
$this->db->show_errors();
} catch (Exception $e) {
echo $e->getMessage();
}
}
public function getStudentById($student_id)
{
return $this->db->get_results("SELECT * FROM `students` WHERE id=$student_id");
}
public function getSchoolByAreaCode($area_code)
{
return $this->db->get_results("SELECT * FROM `schools` WHERE area_code=$area_code;--");
}
}
$Students_DB = new StudentsDatabase();
$student_one = $Students_DB->getStudentById(1);
$school_one = $Students_DB->getSchoolByAreaCode(1);
?>
<div class="entry-content">
<?php
//do something with $student_one and $school_one ...
the_content();
?>
</div><!-- .entry-content -->
Хорошо, мне было интересно, правильно ли это сделать. На самом деле, безопасный или любой другой.
Кажется любопытным, чтобы сделать внешние вызовы db из самого шаблона страницы. Должен ли я регистрировать эти функции в каком-то внешнем файле, а затем просто использовать их внутри шаблона?
Ответы
Ответ 1
Я думаю, что самый "чистый" способ - реализовать плагин, который будет API для вашей темы. Конечно, это зависит от того, является ли это темой только для ваших собственных целей, потому что Wordpress (пока) отсутствует у менеджера зависимостей.
Подводя итог - в теме используйте этот API.
Ответ 2
Поместите объявления class
и т.д. в файл functions.php темы. Или, что еще лучше, require_once
их там и поместите в папку assets
или includes
темы.
-/theme/
-/includes/classes/class-studentsDatabase.php
-functions.php
В функциях .php
define('TEMPLATE_PATH', get_template_directory());
require_once(TEMPLATE_PATH . '/includes/classes/class-studentsDatabase.php');
Вы можете создать экземпляр class
для темы в целом или по мере необходимости на страницах шаблона, как вы сейчас делаете.
Что касается безопасности, я бы не стал размещать соединения БД, которые должны быть защищены в рамках темы, которая будет отправлена в дикую природу.
Я не уверен, что следую тому, что вы делаете с этой целью, но, как представлено, я бы обработал этот бит вне среды темы.
Опять же, не зная ваш прецедент, тема может использовать внешний api, и что api может быть wordpress wp-json api, управляющим этим соединением DB на центральном сайте.
Это позволило бы тере GET
/POST
конечной точке (точкам), которая обрабатывает (а) аутентификацию и любой CRUD, и уменьшит множество потенциальных проблем безопасности. Тема на внешнем сайте будет просто анализировать возвращаемый json и не будет иметь доступ к DB за пределами этого.
Ответ 3
Существует также более радикальный способ работы с несколькими БД в Wordpress. Как следует из wpdb Страница Codex:
Объект $wpdb может разговаривать с любым количеством таблиц, но только с одной базой данных за раз; по умолчанию базу данных WordPress. В редком случае вам нужно подключиться к другой базе данных, вам нужно будет создать экземпляр собственного объекта из класса wpdb с помощью собственной информации о подключении к базе данных. Для чрезвычайно сложных настроек со многими базами данных, вместо этого используйте hyperdb.
Hyperdb - это плагин, который помогает с несколькими БД и заменяет ваше переосмысление организации кода.