Доступ к внешней базе данных с использованием класса 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 - это плагин, который помогает с несколькими БД и заменяет ваше переосмысление организации кода.