Библиотека для 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 например, то и разделы библиотеки будут названы строчными буквами) и они же будут служить для разделения категорий книг при запросе к базе данных.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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-блоге хранилища файлов с удобным выводом данных по ним (бинарные данные можно хранить и непосредственно в базе при желании) или каких-то схожих задач.

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



Category Рубрики: Блоггинг, Кодинг | Tag Метки: , , , , | Comments 2 комментария »

2 комментария

  1. Ванёк says:

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

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

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