Решил переделать страницу с книгами на своём сайте, воспользовавшись доступом к MySQL, который всё равно используется в wordpress. Суть переделки довольно проста — создать функцию, которая, найдя в теле страницы определённый тег, заменяла бы его некоей информацией, полученной из базы данных wordpress. В базе, в свою очередь, может быть что угодно, в моём случае — описания и ссылки на файлы книг, представленных в «Библиотеке». Сложного в написании такой функции ничего нет, по таком принципу кстати работают многие плагины, например вставляющие видео или музыку на страницу.
Принцип действия функции вставки данных на страницу
При вызове функции она в цикле обходит список атрибутов тега, затем по каждому атрибуту делает запрос к базе MySQL, полученную выборку разбирает и выводит данные на страницу в виде таблицы. Данные заносятся в базу руками, но желающие, воспользовавшись руководством «Как написать плагин для WordPress«, могут сделать страничку для загрузки информации в базу wordpress через браузер.
Создание новой таблицы в базе данных WordPress
Подготовим поле для дальнейшей деятельности — создадим в MySQL-базе wordpress’а новую таблицу (свою я назвал biblio) следующего вида:
id | section | isbn | name | authors | description | book_url | book_cover_url |
Самый простой способ создать таблицу — это выполнить запрос CREATE TABLE к базе данных:
CREATE TABLE `wp_biblio` (
`id` INT NOT NULL AUTO_INCREMENT,
`section` VARCHAR(30) NOT NULL default '',
`isbn` VARCHAR(70) NOT NULL default '',
`name` VARCHAR(100) NOT NULL,
`authors` VARCHAR(50) NOT NULL default '',
`description` TEXT NOT NULL default '',
`book_url` VARCHAR(255) NOT NULL default '',
`book_cover_url` VARCHAR(255) NOT NULL default '',
UNIQUE KEY id (id)
)DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Для желающих лучше разобраться в параметрах запроса в «Библиотеке» представлена отличная книга SQL. Полное руководство (2-е издание).
WordPress-функция вывода данных на страницу
Теперь настало время заняться непосредственно написанием функции для wordpress, которая получит данных из базы и выведет их на страницу в указанном месте. У меня указанием места для вставки данных служит тег вида [biblio="attr1, ATTR2, AttrN"]
. Атрибуты тега (слова, заключённые в кавычки) послужат названиями разделов библиотеки (форматирование атрибутов сохраняется, т. е. если указать perl и php например, то и разделы библиотеки будут названы строчными буквами) и они же будут служить для разделения категорий книг при запросе к базе данных.
function my_biblio_former($content) {
global $wpdb;
$biblio_table = $wpdb->prefix . "biblio"; # устанавливаем дескриптор таблицы с книгами
$pattern = "/\[biblio=\"(.+?)\"\]/is"; # шаблон разбора тега [biblio="атрибут1, атрибутN"]
if (preg_match($pattern, $content, $book_sect) && is_page('Библиотека')) { # КАЖДЫЙ РАЗ, как тег встречается на указанной странице - он обрабатывается
$sections = preg_split("/[\s,]+/", $book_sect['1']); # формируется массив из атрибутов тега
$new_content = '
'. $b_section .' |
|
'. $book['name'] .' ISBN: '. $book['isbn'] .' '. $book['authors'] .' '. $book['description'] .' |
';
$content = preg_replace($pattern, $new_content, $content);
return $content;
} # конец обработки тега [biblio]
Код функции я постарался достаточно полно прокомментировать, а подробно о запросах к базе данных MySQL из WordPress я опять же рассказывал в своём руководстве по написанию плагина к WordPress (см. часть пятую — Пишем плагин для WordPress. Функциональная составляющая.).
Написанную функцию нужно добавить в файл functions.php своей темы оформления wordpress (например, воспользовавшись встроенным редактором из административной панели: Внешний вид -> Редактор).
Не забываем также установить фильтр (о фильтрах я рассказывал ранее) для вызова фнкции:
add_filter('the_content', 'my_biblio_former', 1);
Заключение — проверка работы функции вывода данных из базы
Вот и всё, функция готова и работает, примером чему служит страница «Библиотека» моего блога, представляющая из себя один-единственный тег [biblio="Perl, PHP, SQL"]
, при этом разделы библиотеки выводятся в том порядке, в каком они перечислены в атрибутах тега.
Рассмотренную в этой заметке функцию легко приспособить для организации в WordPress-блоге хранилища файлов с удобным выводом данных по ним (бинарные данные можно хранить и непосредственно в базе при желании) или каких-то схожих задач.
Экспериментируйте и творите, удачи! 🙂
1. В скрипте функции таки не хватает одной закрывающей фигурной скобки
2. И еще не понятно… После внесения правок — библиотека отображается, но пропадает весь контент… Т.е. — есть лента с шапками сообщений, а самих сообщений нет… чего-то с заменой контента не так, но не могу понять что…
А в остальном — большое СПАСИБО за ратный труд…
Сейчас проверять некогда, вот функция, которая у меня страницу с книгами формирует: http://pastebin.dimio.org/pastebin.php?show=881655