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

3 12

3 ответа:

Я думаю, что самый "чистый" способ-это реализовать плагин, который будет API для вашей темы. Конечно, это зависит, если это тема только для ваших собственных целей, потому что Wordpress (до сих пор) не хватает от менеджера зависимостей.

Чтобы подвести итог-в теме используйте тогда этот API.

Поместите объявления class и т. д. в функциях .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, управляющим этим подключением к БД на центральном сайте.

Это позволит теме GET / POST к оконечной точке(оконечным точкам), которые обрабатывают (обрабатывают) аутентификацию и любой CRUD, и смягчают большой потенциал вопрос безопасности. Тема на внешнем сайте будет тогда просто разбирать возвращенный json, и не будет иметь никакого доступа к БД за пределами этого.

Существует также более радикальный способ работы с несколькими DBs в Wordpress. Как следует из Wpdb Codex page:

Объект $wpdb может работать с любым количеством таблиц, но только с одной базой данных одновременно; по умолчанию база данных WordPress. В редких случаях, когда требуется подключиться к другой базе данных, необходимо создать экземпляр собственного объекта из класса wpdb с информацией о подключении к базе данных. Для чрезвычайно сложных установок с большим количеством баз данных рассмотрим вместо этого используется hyperdb.

Hyperdb - это плагин, который помогает работать с несколькими DBs и заменяет ваше чрезмерное мышление об организации кода.