Создание плагина: запись в базу данных

В предыдущих статьях

рассматриваются базовые понятия и приемы, используемые при создании плагинов WordPress.



Следующий шаг - это сделать так, чтобы плагин хранил все необходимые текстовые данные не внутри php-файла, а в базе данных. Это позволит добавлять новые данные, не изменяя файл(ы) плагина.

Хранение данных плагина в базе данных WordPress

Плагин может записывать в базу данных:

  • Настройки- то, что выбирает пользователь, когда устанавливает плагин. Такие данные обычно сохраняют с использованием механизма опций [ref text="WordPress options mechanism" url="//codex.wordpress.org/Writing_a_Plugin#Saving_Plugin_Data_to_the_Database"].
  • Данные - информация, добавляемая в процессе работы плагина, которая обычно связана с отдельными записями, категориями и т.д.. Данные можно хранить в отдельной таблице базы данных MySQL, которую нужно для этого создать. Также можно хранить данные как метаданные записей, так называемые пользовательские поля (Custom Fields) ([ref text="WordPress' Post Meta" url="//codex.wordpress.org/Writing_a_Plugin#Saving_Plugin_Data_to_the_Database"]).

Обычно плагин автоматически создает таблицу в базе данных MySQL для хранения данных (это должно происходить во время установки плагина, или пользователь может выполнить соответствующий SQL-запрос в [ref text="phpMyAdmin" url="//codex.wordpress.org/phpMyAdmin"]).
Для того чтобы автоматически создавать и обновлять таблицу базы данных:

  • Нужна PHP-функция, которая создает таблицу базы данных.
  • Нужна PHP-функция обновления на случай, если для новой версии плагина потребуется таблица базы данных с другой структурой.
  • WordPress должен вызывать эти функции при активации/обновлении плагина.

Создание таблицы базы данных

Итак, пишем функцию с именем tbl_install, которая создает таблицу базы данных.
Префикс таблицы базы данных
В файле wp-config.php владелец сайта WordPress может определить префикс базы данных WordPress  (по умолчанию это wp_). Применяемое значение префикса хранится в переменной $wpdb->prefix. (В WordPress до версии 2.1 это значение хранилось в переменной $table_prefix).
Сначала задаем имя таблицы базы данных с именем tblname:

function tbl_install () {
global $wpdb;
$table_name = $wpdb->prefix . "tblname";

Попытка найти таблицу с именем $table_name с помощью SQL-запроса SHOW TABLES (проверяем существование такой таблицы):

if($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {

Если этой таблицы еще нет, ее нужно создать.
Создать таблицу можно с помощью прямого SQL-запроса или с помощью функции dbDelta
из файла wp-admin/includes/upgrade.php (этот файл нужно загрузить, т.к. по умолчанию он не загружается). Функция  dbDelta сравнивает текущую структуру таблицы с требуемой структурой и добавляет или изменяет эту структуру, поэтому она используется для обновлений.  (Примеры использования функции dbDelta можно посмотреть в файле wp-admin/upgrade-schema.php).
При использовании функции dbDelta имейте в виду, что

  • Каждое поле в SQL-выражении должно располагаться на отдельной строке.
  • Между словами PRIMARY KEY и определением первичного ключа должно быть два пробела
  • Нужно использовать ключевое слово KEY, а не его синоним INDEX, и должен быть задан, по крайней мере, один ключ KEY.

Итак, создание или обновление таблицы:

$sql = "CREATE TABLE " . $table_name . " (
             id mediumint(9) NOT NULL AUTO_INCREMENT,
             time bigint(11) DEFAULT '0' NOT NULL,
             name tinytext NOT NULL COLLATE utf8_general_ci,
             text text NOT NULL COLLATE utf8_general_ci,
             url VARCHAR(55) NOT NULL COLLATE utf8_general_ci,
             UNIQUE KEY id (id)
          );";

require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);

Будет создана такая таблица:

Таблица базы данных

В этой таблице для плагина, который добавляет в заданное место на странице случайно выбранную фразу, можно хранить фразы (text), а также время добавления и имена пользователей, которые добавили фразы.
Типы данных:
MEDIUMINT - целые числа от -8 388 608 до 8 388 607
BIGINT - целые числа от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807
TINYTEXT - не более 255 символов
TEXT - не более 65 535 символов
VARCHAR - не более 255 символов.
(в скобках указывается заявленное максимальное количество символов)

Модификаторы:
NOT NULL - поле должно быть явно инициализировано, т.е. не может содержать неопределенное значение
AUTO_INCREMENT - при добавлении в таблицу новой записи значение этого поля будет автоматически увеличиваться на 1
DEFAULT - задает значение, используемое по умолчанию, когда значение явно не задано
COLLATE utf8_general_ci - задает сравнение (или сопоставление, collation)
UNIQUE KEY - уникальный ключ
***
Продолжение следует ...

Создание плагина: запись в базу данных: 5 комментариев

      1. Art

        Да это все спамеры гнусные, у них любой сайт на них похож, лишь бы ссылку вставить.

        Мне же интересно - почему никогда не делается проверка на ошибки? Например, на пустой рекордсет?
        И почему нет примеров работы с другой базой, не основной? Иногда, имхо - логичней хранить базу рядом, а не пихать все в одну общую.

  1. Витос

    Сделал все по инструкции, все получилось, залил на сайт и вылезла одна маленькая ошибка: в шапке сайта в виде логотипа стоит кнопка главной страницы, так вот после указанных действий эта кнопка сделалась не просто логотипом на общем фоне, а визуально выделенным блоком, логотип на белом фоне, залил все назад — ошибка пропала
    можешь подскажете в чем проблема?

Добавить комментарий