Пишем wordpress плагин. Работа с БД.
Во второй статье про плагин hello_world2 для wordpress мы использовали механизм опций для работы с БД. Это позволяло сохранять пары значений и получать их обратно из БД. Для простейших плагинов этого, может быть и достаточно, но если вам понадобится создать свою таблицу или обработать данные стандартных таблиц, то вам нужно будет обращаться к БД непосредственно. |
Напоминаю, что это третья статья из цикла статей про написание плагинов для wordpress.
Предыдущие две можете найти здесь:
А в этой статье я рассмотрю механизм работы с базой данных в wordpress.
Все работа с БД в wordpress`е реализована через класс wpdb. В любом месте вашего скрипта вы можете обратиться к объекту этого класса $wpdb.
Методы
$wpdb имеет методы, достаточные для выполнения любой операции.
Например, чтобы выбрать все строки результата можно использовать метод
$wpdb->get_results($sql, ARRAY_A);
где $sql – это текст запроса, а ARRAY_A – вид результата в котором вернутся строки.
В данном случае – ассоциативный массив.
А вообще типы могут быть следующими:
- OBJECT – каждый элемент массива будет объектом, а все поля из таблицы станут полями этого объекта
- ARRAY_A - уже сказал
- ARRAY_N – каждая строка будет нумерованным массивом. Обращаться к полям надо будет по числовому индексу
Сразу приведу пример:
function get_mycategories() {
global $wpdb;
$sql = 'SELECT tt.*, t.name AS name FROM '.$wpdb->term_taxonomy.' tt, '.$wpdb->terms.' t WHERE tt.taxonomy = "category" AND t.term_id = tt.term_id';
$result = $wpdb->get_results($sql, ARRAY_A);
?>
<div class="wrap">
<ul>
<? foreach ($result as $cat) { ?>
<li><?php echo $cat['name'] ?> : <?php echo $cat['count'] ?></li>
<? } ?>
</ul>
</div>
<?
}
function get_mycategories_admin_menu(){
add_options_page('My categories', 'My categories', 8, basename(__FILE__), 'get_mycategories');
}
add_action('admin_menu', 'get_mycategories_admin_menu');
?>
Этот плагин просто выводит список всех категорий и кол-во постов в них.
Выглядит это так:
Если не нужно делать выборку, а нужно просто выполнить запрос к БД, например DELETE, INSERT или UPDATE, то можно использовать метод
$wpdb->query($sql);
Для выборки только одной строки из всего результата можно использовать удобный метод:
$wpdb->get_row($sql, type, offset);
Здесь $sql – текст запроса, type – тип возвращаемого значения (выше писал про это), а offset – номер строки результата от начала.
Если надо выбрать вообще только одно значение из всего результата, то используйте метод:
$wpdb->get_var($sql, col_offset, row_offset);
С $sql понятно, col_offset – номер колонки результата, row_offset – номер строки.
Для обеспечения безопасности у класса $wpdb тоже есть метод:
$safe_string = $wpdb->escape($unsafe_string);
Этот метод делает строку $unsafe_string безопасной для передачи в $sql-запрос. То есть если там есть всякие кавычки и т.д., из-за которых можно сделать sql-инъекцию, то он их экранирует. Желательно все данные которые вводит пользователь обрабатывать этим методом перед передачей его в $sql запрос.
Поля
Вы заметили что я в запросах выше вместо называния таблиц использовал поля класса $wpdb. Это не с проста
Имена всех стандартных таблиц wordpress находятся в полях класса $wpdb:
- $wpdb->posts – таблица с постами
- $wpdb->users – пользователи
- $wpdb->comments – комментарии
- $wpdb->links – линки
- $wpdb->options – опции
- $wpdb->postmeta – метаданные постов (поля title, meta_keys, meta_descr)
- $wpdb->usermeta – дополнительные поля пользователей (nick, уровень доступа и т.д.)
- $wpdb->terms – таблица термов (ну короче это такие сущности абстрактные )
- $wpdb->term_taxonomy – таблица типов термов
- $wpdb->term_relationships – таблица связей (посты-категории и т.д.)
Кроме этих полей, есть поле
$wpdb->prefix
В нем хранится префикс для всех стандартных таблиц (по-умолчанию wp_).
Может пригодиться…
Создание своих таблиц
Вполне возможно, что плагину нужно будет сохранять в БД какие-то свои данные.
Для этих целей, очевидно, нужно будет создавать свои таблицы.
Чтобы плагин сам мог создать эту таблицу, первым делом, нужно написать для него функцию, которая создает таблицу (позже напишу почему нужно делать отдельную функцию). Пусть функция будет называться myplugin_install().
Прежде чем создавать таблицу, нужно придумать ей имя. Пусть она будет называться hello_world.
После добавления префикса оно станет таким
$table_name = $wpdb->prefix.’hello_world’
Перед тем как создавать новую таблицу, функция должна будет проверить, не существует ли она уже.
Делается это так:
if($wpdb->get_var(“SHOW TABLES LIKE ‘$table_name'”) != $table_name)
А уже после этого создаем свою таблицу. Например, так:
$sql = "CREATE TABLE " . $table_name . " (
id mediumint(9) NOT NULL AUTO_INCREMENT,
name tinytext NOT NULL,
UNIQUE KEY id (id)
);";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
?>
Здесь после заполнения $sql подключается библиотека upgrade.php так как в ней хранится функция dbDelta().
Можно было и просто выполнить $sql запрос через метод $wpdb->query. Но.
Функция dbDelta может не просто создавать новую таблицу, но и делать апгрейд старой таблицы до новой, если она уже была создана.
Эта функция убирает лишние поля, изменяет старые поля на новые и просто добавляет новые поля. Другими словами, она делает из старой таблицы – новую, сохраняя данные старой.
В моем случае она просто создает таблицу, но все равно… для общего развития полезно про нее знать
Активация и инсталляция
Каждый раз при запуске плагина проверять, есть ли уже нужная таблица или ее надо создавать как-то криво. Поэтому, для плагинов wordpress`а принято это делать только на этапе активации плагина.
Делается это функцией
register_activation_hook(__FILE__,’ myplugin_install ‘);
Первый параметр – это имя файла плагина, второй – функция, которая будет вызываться при активации.
Если хотите закрепить все вышесказанное, то попробуйте написать небольшой плагин, вроде того, что написал я.
Мой плагин можете скачать здесь: Мои контакты.
В нем можете сохранять контактную информацию полезных комментаторов, например.
Удачи и до встречи!
Уважаемый Автор, у Вас в стратье “Пишем wordpress плагин hello_world. Продолжение.” срезалось куда-то продолжение
Неплохие статьи.
Стараюсь рассмотреть все возможности wordpress`а
+Отлично! То что искал (пишу свой плагин как раз не хватало этой инфы), ждем стают про перехват актионс в плагинах.
Про перехват action`ов можешь почитать здесь : https://i-novice.net/pishem-wordpress-plagin-hello_world/.
Возможно, в одной из следующих статей попробую составить кое-какую подборку action`ов с их описаниями
novice, у тебя во второй статье не отображается конец статьи, обрывается на словах “page_title – заголовок окна для вашего плагина (тоже что и поле”, я думаю многим было бы интересно прочитать до конца. Поправь пожалуйста.
Хм. Спасибо, что сказал, а то бы так и было Исправил.
Отличные статьи!
А как создавать посты в вордпрессе с помощью плагина?
К примеру: сунул ссылку на XML, а плагин по этому хмл создал посты.
В зависимости от способа передачи xml-файла или кода в плагин. В общих чертах весь алгоритм будет состоять из 3 шагов:
Вот именно таблица постов меня и интересует, как она устроена?
Установи локально wordpress. Посмотри таблицу wp_posts. Там все довольно просто. Побольше практики 😉
А как пропинговать пост, если записать его только в базу?!
Интересный вопрос. Я не нашел этого в документации. Видимо надо рыться в исходниках.
Автор, огромное спасибо вам за материал. Так просто изложено, что сразу все понятно. Хотелось бы продолжения. Было бы круто еще про аякс почитать как в плагин всунуть.
прочитал эту статью…. мне вот нужно вывести результаты запроса
в файл с одной записью (single.php)
SELECT SUBSTRING(`post_content`, INSTR(`post_content`, “Адрес”)+13, INSTR(`post_content`, “Телефон”)-INSTR(`post_content`, “Адрес”)-13) FROM `wp_posts` where `id`=28
я так понял нужно использовать $wpdb->posts как его подредактировать?
(я имею ввиду твой плагин) чтобы работало и выводило результат запроса в single.php в соответвии с полем ID
Будь очень признателен..
Спасибо за инфу, очень полезная. Как раз нужно написать свой виджет. Буду упражняться.
Спасибо за статью, но подскажите пожалуйста как вывести данные из собственной таблицы на сайт в качестве постов. То есть данные хранятся в собственной таблице, а отображаются на сайте как посты.
Спасибо.
Инфы по работе с БД в wordpres как раз мало.
Спасибо за статьи, очень много подчерпнул информации. Правда у меня ещё остался один вопрос, на который нигде не могу ответа найти. Вопрос касается урлов в фронтенд части. К примеру, я хочу, чтобы плагин формировал свои собственные урлы. К примеру, мы подключаем плагин к какой-то странице и уже от неё формировались бы свои урлы, подгружающие тот или иной контент плагина.
Нечто подобное видел в NextGen Gallery, но чтобы добраться до сути. надо слишком много кода перелопатить, поэтому хотел бы кратко узнать о теории этого вопроса. Заранее большое спасибо
Спасибо за пост.
Подробно, понятно и полезно.
Неплохо бы прикрутить Donations к такому блогу, хотябы с помощью смс. Я бы не пожадничал
Огромное спасибо за статьи, по ним разобрался как написать плагин под свои нужды. Конкретно писал каталог для интернет магазина, вот тут расписал подробно обо всем процессе.
Еще раз спасибо.
Спасибо за статью!! По ней разобрался как работать со своими таблицами баз данных в WP.
Требуется переделать плагин для сайта. Если занимаетесь - сделайте.
Плагин магазина WordPress, WooCommerce, переделать таким образом:
Возможность вставлять цену в рублях, евро, долларах. Вывод в рублях. Обновление по курсу ЦБ