Библиотека для WordPress. Как сделать своё файлохранилище

Решил переделать страницу с книгами на своём сайте, воспользовавшись доступом к 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 = '

';

foreach ($sections as $b_section) { # начинаем обработку массива атрибутов тега
$sql = "SELECT * FROM $biblio_table WHERE `section` = '$b_section'"; # выборка из базы для текущего атрибута
$books = $wpdb->get_results($sql, ARRAY_A); # результаты выборки получаем в виде хэша
$new_content .= '

';

foreach ($books as $book) { # обработка результатов выборки из базы
$new_content .= '

'; # для каждой книги создаём в таблице новую строку
$new_content .= '

'; # в первом столбце находится обложка книги
$new_content .= '

'; # во втором столбце - ИСБН, автор(ы), описание
$new_content .= '

';
} # конец обработки выборки
} # конец обработки атрибутов
$new_content .= '

'. $b_section .'

'. $book['name'] .' скачать '. $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-блоге хранилища файлов с удобным выводом данных по ним (бинарные данные можно хранить и непосредственно в базе при желании) или каких-то схожих задач.

Экспериментируйте и творите, удачи! :)

2 мысли о “Библиотека для WordPress. Как сделать своё файлохранилище”

  1. 1. В скрипте функции таки не хватает одной закрывающей фигурной скобки
    2. И еще не понятно… После внесения правок — библиотека отображается, но пропадает весь контент… Т.е. — есть лента с шапками сообщений, а самих сообщений нет… чего-то с заменой контента не так, но не могу понять что…

    А в остальном — большое СПАСИБО за ратный труд…

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

Ваш адрес email не будет опубликован.