Библиотека для 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 = '<table width="100%" border="1" frame="void" rules="rows" cellspacing="0" cellpadding="2" >';

      foreach ($sections as $b_section) { # начинаем обработку массива атрибутов тега
         $sql = "SELECT * FROM $biblio_table WHERE `section` = '$b_section'"; # выборка из базы для текущего атрибута
         $books = $wpdb->get_results($sql, ARRAY_A); # результаты выборки получаем в виде хэша
         $new_content .= '<tr align="center"><td><h2>'. $b_section .'</h2></td></tr>';
         foreach ($books as $book) { # обработка результатов выборки из базы
            $new_content .=   '<tr align="center">'; # для каждой книги создаём в таблице новую строку
            $new_content .= '<td align="center"><img src="'. $book['book_cover_url']  .'" alt="'. $book['name'] .' скачать"></td>'; # в первом столбце находится обложка книги
            $new_content .=   '<td align="center"><strong><a href="'. $book['book_url'] .'">'. $book['name'] .'</a></strong><br /><strong>ISBN:</strong> '. $book['isbn'] .'<br /><em>'. $book['authors'] .'</em><br />'. $book['description'] .'</td>'; # во втором столбце - ИСБН, автор(ы), описание
            $new_content .=   '</tr>';
         } # конец обработки выборки
      } # конец обработки атрибутов
      $new_content .= '</table>';
      $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-блоге хранилища файлов с удобным выводом данных по ним (бинарные данные можно хранить и непосредственно в базе при желании) или каких-то схожих задач.

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

Еще на похожие темы:

Leave a Reply