Пишем плагин для WordPress. Функциональная составляющая (часть 5)

plugins-wordpress

И снова поговорим о том, как написать для блог-движка WordPress свой плагин. В прошлый раз мы остановились на том, что создали страницу настроек для плагина и добавили её в административную панель WordPress. Настало время перейти непосредственно к работе над самой незаметной, но, тем не менее, одной из самых важных частей плагина — его функционалом. Нам необходимо разработать процедуры, при вызове которых из плагина будут происходить заложенные в его проект действия.

Начнём.

Пишем функции для плагина WordPress

Собственно говоря, поскольку функциональная часть — дело абсолютно индивидуальное, я ограничусь простым примером. Функции моего wordpress плагина будут просто добавлять какое-то слово к заголовкам записей и/или какую-то фразу к содержимому записей.

Создание более сложных функций оставлю для знатоков php, мне же как-то ближе perl. Скажу только, что всегда можно поискать готовый плагин, имеющий в своём составе часть нужного нам функционала, и, если он лицензирован под свободной лицензией, скопировать функции оттуда и переработать их под себя. Текст лицензии, как правило, прилагается к плагину. В крайнем случае в файле плагина будет указано название лицензии, под которой он распространяется.

Функция модиикации заголовка и тела WordPress-публикаций

Напишем и разберём функцию, занимающуюся в нашем плагине непосредственно модификацией заголовка и содержимого публикаций в WordPress-блоге.

function mod_content($title, $content){
    if (get_option('myplug_modify_title')) {
        $title = $title . myplugin_get_phrase($ph_type = "title");
    }
    if (get_option('myplug_modify_content')) {
        $content = $content . myplugin_get_phrase($ph_type = "body");
    }
    return $title;
    return $content;
}

Данная функция получает заголовок и тело записи и затем, если на странице настроек плагина была указана соотвтетствующая опция, обрабатывает полученные данные. В нашем случае — приклеивает в конец заголовка/тела wordpress-публикации случайную фразу, взятую из таблицы настроек плагина.
Затем изменённые (или оставшиеся неизменными) заголовок и тело записи возвращаются назад в движок.

Функция получения случайной фразы из таблицы настроек плагина

А теперь попробуем написать функцию плагина, получающую случайные фразы из таблицы настроек, хранящейся в БД нашего WordPress-блога.

function myplugin_get_phrase($ph_type){
    global $wpsig_sig_table, $wpdb;
    $sql = "SELECT '$ph_type' FROM $myplugin_prefs_table ORDER BY RAND() LIMIT 1";
    $phrase = $wpdb->get_var($sql);
    return $phrase;
}

Эта функция, будучи вызванной, получает на входе имя столбца в таблице БД, из которого нужно взять некое случайное значение. Запрос на выборку организован примитивно и абсолютно неоптимально. При наличии большого количества данных в таблице конструкция сортировки ORDER BY RAND будет достаточно сильно тормозить, но я не предполагаю для совего плагина раздутой таблицы в БД и потому пременяю такой вид соритовки. LIMIT 1, кстати, вернёт нам первое значение из сформированного списка записей.

Если вы собираетесь обрабатывать сколь-нибудь серьёзное количество данных в таблице — обработку вывода необходимо с mySQL переложить на php. То есть получив массив значений при помощи запроса к базе, затем обработать этот массив внутри своего плагина.

Функции WordPress для работы с БД mySQL

Механизм WordPress предоставляет несколько способов (методов) получения информации из БД:

  1. $wpdb->get_results($sql, $type); — получение всех строк результата запроса, где $type может принимать следующие значения:
    • OBJECT — данные возвращаются в виде массива, где каждый элемент является объектом, а его поля — это поля вашей таблицы в БД;
    • ARRAY_A — данные возвращаются в виде ассоциативного массива (хэша);
    • ARRAY_N — каждая строка данных представлена в виде нумерованного массива, каждому полю будет присвоен числовой индекс (по порядку расположения полей в таблице БД).
  2. $wpdb->query($sql); — метод для выполнения так называемых «простых» запросов, применяется для обработки запросов INSERT, UPDATE, DELETE.
  3. $wpdb->get_row($sql, $type, $offset); — получение одной строки из всего результата запроса, где:
    • $type — см. выше;
    • $offset — номер строки, которая будет выбрана из всего результата (хинт: можно генрировать $offset случайным образом и получать случайную строку из запроса).
  4. $wpdb->get_var($sql, $col_offset, $row_offset); — этот метод позволяет получить одно значение из всего результата запроса, соответственно:
    • $col_offset — см. выше;
    • $row_offset — номер столбца, из которого будет взят результат.

    Таким образом, сгенерировав случайные номера строки и столбца, можно получить из базы случайное значение.

Написание плагина для WordPress почти закончено

Что ж, вот мы и рассмотрели функциональную часть плагина. В принципе, он уже должен быть работоспособен. Нам осталось только интернационализировать наш плагин и познакомиться с порядком его добавления в репозитории wordpress.org.
Этим мы и займёмся в следующих выпусках руководства «Как написать плагин для WordPress«, а пока по-прежнему можно сохранить файл с плагином-примером.

Всем удачи! 🙂

Другие заметки по созданию плагина для WordPress

<-- Часть 4. Создание страницы настроек плагина в админке WordPress
Часть 6. Интернационализация и русификация плагина WordPress —>
Общее оглавление к циклу заметок по созданию плагина для WordPress


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

13 комментариев

  1. Матвей says:

    Интересно, если текст c вашего сайта себе копировать, ссылку куда лучше ставить прямо на эту запись блога или же на главную страницу.

  2. Дмитрий says:

    Привет!
    Я плагинов не писал к вордпресу, но что-то мне подсказывает, что здесь ошибочка:
    function mod_content($title, $content){
    if (get_option(‘myplug_modify_title’)) {
    $title = $title . myplugin_get_phrase($ph_type = «title»);
    }
    if (get_option(‘myplug_modify_content’)) {
    $content = $content . myplugin_get_phrase($ph_type = «body»);
    }
    return $title;
    return $content;
    }
    Я так думаю, return ни один не нужен. Скорее всего переменные передаются по ссылке. Второй ретурн вообще не отработает никогда.

  3. Vitalick says:

    Спасибо за статью! очень пригодилась 🙂

  4. Shua says:

    Страница с 4-й частью курса не отображается. Пичаль 🙁
    Пытаюсь разобраться по исходнику.
    В примере вызвала сомнение строка $$myplugin_opt = get_option($myplugin_opt)
    Точно два знака $ в имени переменной ?

    • dimio says:

      Точно два. Это объявление новой переменной, именем которй будет значение старой. Например:

      1
      2
      3
      4
      5
      $var1 = 'var2';
      $$var1 = 'test';
      echo $var2;
      -------------------
      test

      Четвёртую часть починил, спасибо, что сообщили.

    • dimio says:

      У вас в

      1
      $myplugin_opt

      будет лежать название опции. Если вы прямо туда запишете её значение — затрётся название. А так — будет связанная переменная со значением. Я бы изобразил это так:

      1
      $var = { 'имя' => 'значение' }

      И в дальнейшем можно обращаться к значению переменной по имени.

  5. Shua says:

    Век живи — век учись 🙂 Про $$ не знал, интересная особенность языка

  6. Yuri says:

    Попробовал поставить плагин в Вордпресс. При попытке активации вызывает фатальную ошибку:(

    • dimio says:

      Проблему устранил, в WP 3.2.1 проверил — нормально активируется.
      Кстати для поиска ошибок рекомендую на время отладки в php.ini выставить:
      display_errors = On
      Тогда не придётся в логи лазать, сразу будет выдавать описание ошибки и строку, в которой она произошла.

  7. Марк says:

    Спасибо за статью, интересная, вот еще одна статья ( [ссылка] ), которая поможет начинающим на примере разобраться с плагинописанием под WordPress.

  8. Алексей says:

    Спасибо за статью. Пытаюсь написать свой первый плагин, но кроме вывода фразы в начале поста, хочу завязаться на теги внутри этого самого поста. Не подскажите, как это можно сделать?

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