WordPress создание плагина


Одна из главных причин большой популярности WordPress — это простота расширения и изменения системы под свои нужды с помощью плагинов.

На первый взгляд создание плагина может показаться трудной задачей, но на самом деле все проще, чем вы думаете. Это первый урок серии «Создание плагина для WordPress», в которой будут рассмотрены важные принципы и составные части данного процесса. По завершении уроков вы будете готовы к самостоятельным экспериментам по созданию WordPress плагинов, опираясь на общепринятые правила сообщества системы.

Что такое плагин для WordPress

Это PHP код, который изменяет или расширяет начальный функционал системы.

WordPress предоставляет простой, но гибкий API для создания плагинов. Вот некоторые преимущества, которые предлагает WordPress разработчикам:

  • Нет необходимости изменять ядро системы для получения дополнительной функциональности. Это значит плагин будет работать даже после обновления системы.

  • В WordPress есть механизм деактивации плагина, когда ошибка может привести к краху сайта.
  • Модульность кода системы упрощает обновление и сопровождение.
  • Функции плагинов никак не связаны с темами.
  • Один плагин может быть использован с разными темами и иметь независимые от дизайна функции.
  • Код плагина может реализовывать современные техники программирования, ООП например, это никак не повлияет на использование родных функций, классов и интерфейсов WordPress.

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

Название и файлы плагина

Прежде всего вы должны убедиться, что название вашего плагина уникально. Даже если вы не собираетесь выкладывать свое творение на всеобщее обозрение, вы должны быть уверены, что на сайте не возникнет ситуации использования двух плагинов с одним именем. Воспользуйтесь поиском по плагинам WordPress, перед выбором названия.

Для уникальности названия многие разработчики добавляют префикс — инициалы автора или некоторая аббревиатура. Префикс может быть использован везде — в именах файлов, функций, классов, переменных и т.д. Это поможет избежать возможных конфликтов с другими плагинами, темами и самим ядром системы.


Пример. Пусть наш плагин называется “Hello World Plugin” и для увеличения вероятности уникальности названия добавим префикс “My super prefix”, сокращенный до “MSP”. Таким образом мы получим уникальное название “MSP Hello World Plugin”. Поиск по плагинам подтверждает это.

Следующий шаг — создание файлов плагина. Рекомендуется располагать плагин в отдельной папке внутри специальной директории для плагинов. Имя папки должно соответствовать названию плагина, в нашем случае можно назвать  ‘msp-helloworld’. Папка должна содержать главный файл плагина с таким же именем: ‘msp-helloworld.php’.

Так же «кодекс» WordPress рекомендует создать readme.txt файл. В этом файле содержится информация о плагине в стандартной форме. Если вы собираетесь выложить свой плагин в репозиторий плагинов, то наличие этого файла обязательно.

Если ваш плагин использует множество файлов, загружает картинки, css или JavaScript, вам необходимо хранить их в подпапках вашего плагина. Правильная организация структуры файлов — признак хорошего тона. Мы будем придерживаться следующего шаблона:

Структура плагина
Структура плагина

Заголовок плагина

У каждого плагина обязательно должен быть заголовок, это помогает WordPress распознать плагин и вывести информацию о нем на странице управления плагинами.


Заголовок — это комментарий PHP, расположенный вначале главного файла плагина:

  /*  Plugin Name: MSP Hello World  Description: Create hello world message  Version: 1.0  Author: Author's name  Author URI: http://easy-code.ru/  Plugin URI: http://easy-code.ru/lesson/building-wordpress-plugin-part-one  */  

Информация из заголовка будет показана на странице управления плагинами WordPress

Информация о плагине
Информация о плагине

Порядок строк не важен, кодировка файла должна быть UTF-8.

Путь к файлам

Так как мы используем разные файлы для нашего плагина, мы должны определить правильный путь к ним. Папка wp-content может быть перемещена из стандартного положения, поэтому жесткое объявление путей не подходит, они должны определяться автоматически.

В WordPress есть две функции plugin_dir_path и plugin_dir_url для определения адресов файлов:

  define('MSP_HELLOWORLD_DIR', plugin_dir_path(__FILE__));  define('MSP_HELLOWORLD_URL', plugin_dir_url(__FILE__));  

Этот код определяет путь к папке плагина внутри директории WordPress и объявляет константы, содержащие его. После мы можем использовать эти константы вместе с известными относительными путями к подпапкам, например: MSP_HELLOWORLD_DIR.’assets/img/image.jpg’.


Используя эти константы мы также можем подключать необходимые файлы в главном PHP файле:

  function msp_helloworld_load(){     if(is_admin()) // подключаем файлы администратора, только если он авторизован   require_once(MSP_HELLOWORLD_DIR.'includes/admin.php');     require_once(MSP_HELLOWORLD_DIR.'includes/core.php');  }  msp_helloworld_load();  

Состояние плагина

После установки плагин может быть в активном или деактивированном состоянии.

Если плагин активирован, то WordPress будет выполнять его код при каждой загрузке страницы.

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

WordPress отслеживает состояние плагина и исполняет необходимый код, когда состояние меняется. Если какой-то код предназначен для выполнения только при активации или деактивации, можно исполнять его только в эти моменты, а не при каждой загрузке страницы.


Например, если плагин хранит свои настройки в базе данных, необходимо удалить их из базы при удалении плагина. Как это сделать?

Для выполнения действий при активации и деактивации мы должны зарегистрировать так называемые ‘activation hook’ и ‘deactivation hook’. Таким образом мы сообщим WordPress какую функцию необходимо выполнить при том или ином событии. Пример:

  register_activation_hook(__FILE__, 'msp_helloworld_activation');  register_deactivation_hook(__FILE__, 'msp_helloworld_deactivation');    function msp_helloworld_activation() {    	// действие при активации  }    function msp_helloworld_deactivation() {  	// при деактивации  }  

Для выполнения действий при удалении плагина есть 2 способа.

Первый — это создать файл uninstall.php в главной папке плагина (вместе с главным файлом и readme.txt) и включить в него необходимый код. Если uninstall.php существует, WordPress автоматически выполнит его при удалении плагина. Второй способ — зарегистрировать uninstall hook in так же как события для активации и деактивации. Пример:

  register_activation_hook(__FILE__, 'msp_helloworld_activation');    function msp_helloworld_activation() {     // действие при активации  // регистрируем действие при удалении   register_uninstall_hook(__FILE__, 'msp_helloworld_uninstall');  }    function msp_helloworld_uninstall(){     //действие при удалении  }  

Важно, что сработает только один из способов, если существует uninstall.php, то зарегистрированная функция не сработает.

Общие правила

Подводя итоги, сформулируем несколько правил, которых необходимо придерживаться при создании плагина для WordPress:


  • Придумайте уникальное название
  • Создайте отдельную папку для плагина
  • Соблюдайте структуру хранения файлов, создайте подпапки для PHP файлов, переводов и других файлов
  • Создайте главный файл плагина и заполните заголовок плагина.
  • Создайте readme.txt
  • Используйте функции для определения путей к файлам
  • Создайте дополнительные PHP файлы и подключите их в главном
  • Создайте функции для обработки активации и деактивации
  • Создайте скрипт для удаления

easy-code.ru

Простейшая реализация плагина

Если не хотите заморачиваться, вот простейшая реализация. В результате, перед каждым постом будет выводиться блок кнопок.

Создайте файл с именем YandexShareLite.php или любым другим и скопируйте в него код. После этого загрузите данный файл по фтп в каталог <корень_сайта>/wp-content/plugins/, зайдите в админку, в меню выбираете Плагины → Установленные, и жмёте ссылку Активировать для YandexShareLite.


ent''yandexshare_run' );

// функция добавляет кнопки расшаривания перед постом
function yandexshare_run($content) {
    
// код со страницы https://tech.yandex.ru/share/
    
$data '
        <script type="text/javascript" src="//yastatic.net/es5-shims/0.0.2/es5-shims.min.js" charset="utf-8"></script>
        <scrip.

p;от Яндекса + старое содержимое
    
return $data $content;
}

Как это работает? С помощью add_filter() цепляется обработчик хука the_content. Обработчиком будет наша функция — yandexshare_run(). В качестве параметров передаётся содержимое поста. Таким образом, с ним можно делать вообще всё, что захочется. В данном случае, возвращаем код для генерации кнопок и старое содержимое.

WordPress славится своей расширяемостью. Это обеспечивает мехнанизм хуков, которые придуманы едва ли не на все возможные случаи. Полный список состоит из более, чем 1700, для версии движка 4.1, штук. Для написания плагинов знать всё не нужно. Официальной документации, обычно, хватает.

Продвинутая реализация плагина

Lite-версия получилась элементарной, верно? Не успели начать, а уже всё оказалось готово. Кто-то даже загорелся, что так же просто можно добавить код Google Adsense. Не буду разочаровывать — конечно же можно!

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


  1. выводить кнопки до и после поста;
  2. предоставлять интерфейс настройки размера кнопок (большие или маленькие) и выбора сервисов, интересных веб-мастеру;
  3. добавлять удобную ссылку «Настройка» в списке плагинов, чтобы хозяин блога мог сразу перейти к управлению внешним видом вывода;
  4. подчищать за собой данные при удалении.
<?php
/*
Plugin Name: YandexShare
Plugin URI: https://a-panov.ru/plagin-dlya-wordpress/
Description: Добавление кнопок «поделиться» разных социальных сетей
Version: 1.0
Author: Andi Panov <a@a-panov.ru>
Author URI: https://a-panov.ru/
License: GPLv2
*/

// подключим фильтр, срабатывающий перед выводом содержимого страницы (поста)
add_filter

span>) {
    
// получить сервисы для иконок
    
$sharebtn get_option('yandexshare_bnts');
    
    
// если ни одного сервиса не выбрано, будем использовать только основные
    
if ( !$sharebtn $sharebtn 'vkontakte,odnoklassniki,facebook,twitter,gplus';
    
    
// показывать ли большие иконки
    
$bigbtn get_option('yandexshare_bigbtn');
    
    
// непосредственно код Яндекс Share. Детали — https://tech.yandex.ru/share/
    // необходимые скрипты
    
$script '
        <script type="text/javascript" src="//yastatic.net/es5-shims/0.0.2/es5-shims.min.js" charset="utf-8"></script>
        <script type="text/javascript" src="//yastatic.net/share2/share.js" charset="utf-8"></script>'
;
    
// здесь учитываем желаемые иконки и их размер
    
$data '<div class="ya-share2" data-services="' $sharebtn '"' . ($bigbtn '' ' data-size="s"') . '></div>';
    
    
// вывод данных: подключение скриптов единожды, блок кнопок до статьи,
    // статья и ещё один аналогичный блок кнопок
    
return $script $data $content $data;
}

// добавим пункт в основное админ-меню WP
add_action('admin_menu''yandexshare_admin_menu');
function 
yandexshare_admin_menu(){
    
add_options_page('YandexShare''Настройки YandexShare''manage_options''yandexshare-options''yandexshare_admin_manage');
}

// «морда» для управления настройками
function yandexshare_admin_manage() {
    
// какие иконки соцсетей доступны
    
$share_bnt_list = array(
        
'vkontakte'     => 'ВКонтакте',
        
'facebook'      => 'Facebook',
        
'odnoklassniki' => 'Одноклассники',
        
'moimir'        => 'МойМир',
        
'gplus'         => 'Google+',
        
'twitter'       => 'Twitter',
        
'blogger'       => 'Blogger',
        
'linkedin'      => 'LinkedIn',
        
'lj'            => 'Livejournal',
        
'viber'         => 'Viber',
        
'whatsapp'      => 'WhatsApp',
    );
    
    
// POST-параметры передаются из нашей формы настроек
    
if (isset($_POST['yandexshare_bigbtn'])) {
        
// большая кнопка
        
$bigbtn = empty($_POST['yandexshare_bigbtn']) ? 1;
        
        
// если установлено — добавляем в опции, иначе — удаляем,
        // т. к. значение по умолчанию и так ноль
        
if ($bigbtnupdate_option('yandexshare_bigbtn'1);
        else 
delete_option('yandexshare_bigbtn');
        
        
// если массив требуемых кнопок установлен...
        
if (isset($_POST['yandexshare_bnts']) && is_array($_POST['yandexshare_bnts'])) {
            
// приводим его к ожидаемому формату
            
$sharebtn =  $_POST['yandexshare_bnts']
                       ? 
implode(','$_POST['yandexshare_bnts'])
                       : 
'';
        }
        
        
// если сняты все отметки...
        
if (empty($sharebtn)) {
            
// удаляемся из настроек WP
            
delete_option('yandexshare_bnts');
            
// и оставляем значения по умолчанию
            
$sharebtn 'vkontakte,odnoklassniki,facebook,twitter,gplus';
        } else {
            
// иначе — установим требуемые кнопки
            
update_option('yandexshare_bnts'$sharebtn);
        }
        
$success true;
    } else {
        
// получить содержимое наших опций
        
$bigbtn get_option('yandexshare_bigbtn');
        
$sharebtn get_option('yandexshare_bnts');
        
        
// если ни одного сервиса не выбрано — выводим основные;
        // для деактивации плагина его нужно отключить!
        
if ( !$sharebtn $sharebtn 'vkontakte,odnoklassniki,facebook,twitter,gplus';
    }
    
$sharebtn_list explode(','$sharebtn);
?>
<div class="wrap">
    <h2>Настройки YandexShare</h2>
    <?php if ( isset($success) ) {
        echo 
'<div class="updated"><p>Настройки успешно сохранены.</p></div>';
    } 
?>
    <form action="" method="post">
      <table class="table">
        <tbody>
          <tr>
            <th>Использовать большие кнопки</th>
            <td>
              <select name="yandexshare_bigbtn">
                <option value="0">Нет</option>
                <option<?= $bigbtn ' selected="selected"' '' ?> value="1">Да</option>
              </select>
            </td>
          </tr>
          
          <tr>
            <th>Какие сервисы использовать</th>
            <td>
              <select name="yandexshare_bnts[]" size="<?= count($share_bnt_list?>" multiple>
                <?php foreach ($share_bnt_list as $k => $v) {
                    echo 
'<option ' in_array($k$sharebtn_list) ? 'selected="selected" ' '' 'value="' $k '">' $v '</option>';
                } 
?>
              </select>
              <p class="description">Убирать/отмечать произвольные сервисы можно с зажатой клавишей Ctrl</p>
            </td>
          </tr>
        </tbody>
      </table>
      <p class="submit"><input type="submit" value="Сохранить изменения" class="button button-primary"></p>
    </form>
</div>
<?php
}

// добавим ссылку на Настройки в списке плагинов
add_filter('plugin_action_links''yandexshare_links'102);

// подцепим ссылку на Настройки
function yandexshare_links($links$file) {
    
$plugin_file basename(__FILE__);
    if (
$file == $plugin_file) {
        
$settings_link '<a href="options-general.php?page=yandexshare-options">Настройки</a>';
        
array_unshift($links$settings_link);
    }
    return 
$links;
}

// если плагин удаляется, подчистим все следы деятельности
register_uninstall_hook(__FILE__'yandexshare_remove');

// функция для удаления устанавливаемых плагином опций
function yandexshare_remove(){
    
delete_option('yandexshare_bnts');
    
delete_option('yandexshare_bigbtn');
}

Кода стало гораздо больше, но логически за всё отвечают 4 блока.

Вывод кнопок

Код немного усложнился по сравнению с лайт-версией. Во-первых, мы учитываем размер кнопок и соцсети, в которых можно поделиться. Данные получаем из сохранённых настроек, либо определяем значения по умолчанию. Во-вторых, учитываем, что js-скрипты нужно подключать один раз.

Настройка функций плагина

Подключение настроек выполняется в 2 этапа. Сначала подцепляем экшен admin_menu, который вызывает функцию yandexshare_admin_menu. Данная функция определяет страницу с настройками. Ссылка появится в меню Настройка, под названием Настройки YandexShare, видна будет только администратору — опция manage_options. Идентификатором меню будет строка yandexshare-options, а за отображение страницы наших настроек отвечает функция yandexshare_admin_manage().

Комментарии помогут разобраться, что происходит в функции. Если возникнут какие-то вопросы, пишите их в комментариях, попробуем найти ответ.

Добавление ссылки настройки в списоке плагинов

Реализуется с помощью фильтра plugin_action_links. Функция-обработчик — yandexshare_links() — принимает список установленных ссылок и имя файла-плагина. Нам нужно узнать вызов «своего» плагина и добавить туда новый элемент.

Удаление сохранённых данных

С помощью функции register_uninstall_hook() можно указать свою функцию, которая будет вызвана при удалении плагина. Хорошо, если плагин подчищает за собой, не оставляя ненужных данных. У нас определяются две настройки: yandexshare_bigbtn для вывода маленьких кнопок и yandexshare_bnts, содержащая список сервисов.

В общем-то, на этом всё. Надеюсь, данных знаний достаточно для понимания основ. В дальнейшем, останется ставить задачу, искать описание соответствующих хуков и добавлять фильтры/экшны для работы с ними.

Успехов!

a-panov.ru

Плагин, отправляющий письмо при публикации поста.

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

Этот пример я подглядел на официальном сайте wordpress. Давайте напишем плагин, который при изменении определенного поста на статус «Опубликовать» отсылает на указанный адрес электронной почты сообщение что появился новый пост. Думаю этого будет достаточно для первого урока.

Переходим к делу.

Создание файла плагина wordpress.

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

В wordpress по умолчанию плагины хранятся в папке wp-content/plugins, причем если Ваш плагин состоит только из одного файла, то можно кинуть его прямо в эту директорию. Если плагин включает в себя несколько файлов, то необходимо поместить его в отдельную директорию. Хорошим тоном является называть папку так же как и плагин.

Лучше всего сразу приучиться создавать отдельную папку для плагина. Создадим на локальном компьютере папку. У меня она будет называться post_publish_email_send. Так же создадим пустой php файл с тем же названием post_publish_email_send.php, в котором будет пока лишь открывающий и закрывающий теги кода. Если Вы собираетесь Выложить Ваш плагин в сети то следует сделать уникальным его имя. То имя, которое выбрал я в данном примере скорее всего уникально но лучше это проверить поискав на официальном сайте wordpress плагин с подобным именем. Если не найден то значит название нам подходит.

Добавление стандартной информации в plugin wordpress.

Каждый плагин wordpress должен содержать обязательный заголовок несколькими полями. именно эти поля после добавления плагина в WordPress будут отображаться на странице плагинов напротив вашей разработки.

Для того чтобы Ваш плагин соответствовал стандартам лицензии GPL2 просто добавьте чуть ниже следующие строки, указав в нужном месте электронный адрес:

Сохраняем файл и наш плагин готов, правда никакой смысловой нагрузки пока не несет и в списке его не видно.

Добавляем наш плагин в wordpress.

Для того, чтобы добавить наше гениальное произведение в админку системы управления wordpress необходимо скопировать только что созданную папку post_publish_email_send с файлом post-publish-email-send.php в папку wp-content/plugins на веб сервере.

Неактивные плагины
Неактивные плагины

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

Если вместо описания отображаются кракозябры, то скорее всего проблема в кодировке файла. Попробуйте поменять весь код файла в кодировку UTF-8. Мне помогло.

Пишем функцию отправки почты в плагине wordpress.

В стандартном функционале wordpress имеется функция wp_mail(); которая построена на стандартной функции mail() из php. Отличие этих функции заключается в различии типов некоторых параметров, но в данный момент это не важно. В функции wp-mail они несколько расширены и более удобны для использования, хотя ее конструкция основана на функции mail() из php.

Про $post_ID будет написано чуть позже. Сейчас могу сказать что это ID записи которую опубликовали.

Как видите в функции мы использовали всего три параметра: адрес получателя, тему письма и тело сообщения. Остальные поля можно оставить в данном случае незаполненными. Для того чтобы функция wp_mail работала, в файле php.ini должна быть разрешена отправка почты.

Вешаем на событие публикации поста функцию.

В WordPress при публикации поста происходит событие publish_post. Кроме того это событие происходит если запись была отредактирована и опубликована заново.

Теперь нам осталось повесить на это событие нашу функцию, так чтобы при публикации поста на указанный адрес электронной почты приходило письмо. Практически на любой действие в wordpress можно повесить так называемый хук (действие). Мы в данном случае повесим на это событие хук-функцию отправки почтового сообщения.

Список всех возможных событий можно увидеть тут: http://codex.wordpress.org/Plugin_API/Action Reference

На этой странице мы можем найти действие publish_post — именно по нему мы хотим чтобы отправлялось письмо. Данное действие содержит аргумент post ID — идентификатор записи. Этот идентификатор будет отправлен в нашу функцию, как раз в переменную $post_ID.

Теперь мы должны использовать функцию add_action которая добавляет определенные действия на указанное событие.

Теперь когда с add_option стало все более менее понятно, можно прикрепить к событию publish_post. Для этого в нашем файле плагина пропишем следующую строчку:

В коде плагина не оставляйте пустых строк вне тегов так как wordpress на это выдает предупредительное сообщение при установку.

Вот и все, наш плагин готов и теперь осталось его активировать и проверить как произойдет отправка почтового сообщения при публикации записи. Если письмо не пришло, то значит в настройках php.ini запрещена отправка почты и поэтому придется отправлять почту через сокеты, но это уже другая тема.

В одном из следующих постов мы попробуем написать более сложный плагин.

omelchuck.ru

Основные правила при создании плагина

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

Структура

Если вы планируете реализацию сложной функциональности, то лучше разделить код на несколько файлов и папок. К примеру, в главном файле можно хранить основной класс, а дополнительные функции в отдельных. Кроме того, если вы хотите сделать собственные элементы управления в панели администратора ВордПресс, то можно создать отдельные папки для хранения CSS и JavaScript.

Имена функций и классов

Начиная создание плагина для wordpress, уделяйте должное внимание именам функций и классов. Например, если он будет предназначен для показа популярных постов, то вы, скорей всего, захотите дать ему название «Top Posts», а основной функции «top_posts», и это будет не правильным решением. Слишком очевидные названия могут послужить причиной появления проблем совместимости с другими расширениями, имеющими похожую функциональность.

Чтобы обойти эти проблемы, можно просто использовать уникальные префиксы. Придумайте случайный набор букв и добавляйте перед названием каждой функции, вот так: «came_top_posts». Чем нелогичней мы пишем префикс, тем меньше вероятность совпадений.

Безопасность

Безопасность всегда занимает наиважнейшее место в веб-разработке. Если в коде будут серьезные уязвимости, то взломщики смогут получить контроль над всем сайтом. В первую очередь, речь идет о фильтрации данных, введенных пользователями, и правильной выдачи привилегий. К счастью, в ВордПресс уже имеется множество способов для их обработки, от вас требуется только правильное использование.

Документация

Если вы рассчитываете на массовое распространение, то вы просто обязаны вести документацию в коде, тем более, что существует множество программ, упрощающих данное действие. Не забывайте, что комментирование кода никогда не бывает лишним. Разработчику трудно запоминать те части кода, которые были написаны несколько месяцев или лет назад. А особенно это актуально при работе в команде или большом количестве пользователей, тогда документирование становится необходимостью. Помимо этого, не игнорируйте стандарты кода, общепринятые в среде веб-разработчиков.

Удаление «хвостов»

Многие расширения оставляют после себя кучу ненужного мусора, такого как: отдельные таблицы в базе, мета-данные постов и комментариев, и т.д. Эта информация только захламляет ваш код и, соответственно, негативно влияет на скорость загрузки веб-сайта. К счастью, разработчики WordPress не упустили данный момент из виду и добавили несколько хуков для решения проблемы:

register_activation_hook ()

С помощью данного хука можно сделать так, чтобы ваш код выполнялся только тогда, когда плагин активирован. Он использует путь к файлу и название функции в качестве аргументов. Кроме того, им можно воспользоваться для того, чтобы проверить версию, обновления и правильность версии PHP.

register_uninstall_hook()

Когда администратор веб-сайта удаляет расширение, срабатывает именно этот хук. Он предназначен для очистки лишней информации, такой как: записи в БД, настройки и т.д. Единственным недостатком данного хука является то, что для его выполнения должно запускаться расширение. Если у вас этот способ не работает, то можно попробовать создать файл «uninstall.php». Подробности находятся в документации WordPress.

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

Результатом всех этих манипуляций должно стать то, что пользователь сможет установить ваше расширение, пользоваться им 5 лет, а потом удалить, без следов в базе или файловой структуре веб-сайта.

Создание плагина

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

Для начала, создайте новую папку по пути «wp-content/plugins» и назовите ее «cametopposts», например. В качестве ее содержимого создайте файл c аналогичным названием «cametopposts.php». Откройте файл в любом текстовом редакторе и вставьте следующие строки:

<?php
/*
Plugin Name: Came Top Posts
Plugin URI: http://www.cametopposts.ru
Description: This is my first simple plugin
Author: MyName
Version: 1.0
Author URI: http://www.mysite.ru
*/
?>

На самом деле, для успешного подключения собственного плагина в WordPress нужно написать только «Plugin Name», но если вы решите поделиться им в интернете, то желательно добавить больше информации.

Теперь, если все заполнено правильно, то «Came Top Posts» появится в панели администратора WordPress, с возможностью активации. Это пока только основа, не выполняющая никаких действий, но ее наличие необходимо.

Чтобы плагин действительно работал, нужно реализовать в нем следующий функционал:

Записываем количество просмотров

Первая функция, которую вам необходимо реализовать, будет обновлять счетчик посещения каждого поста, когда пользователь перейдет на его страницу. Она выглядит следующим образом:

function came_tposts_add_view() {
if(is_single()) {
global $post;
$curr_views = get_post_meta($post->ID, "came_tposts_views", true);
if(!isset($curr_views) OR empty($curr_views) OR !is_numeric($curr_views) ) {
$curr_views = 0;
}
$new_views = $curr_views + 1;
update_post_meta($post->ID, "came_tposts_views", $new_views);
return $new_views;
}
}

Как вы заметили, в первой строке идет проверка, находится ли в данный момент пользователь на странице статьи. Если это так, то мы берем глобальный объект, содержащий в себе некоторые данные о статье, такие как: ID, заголовок, дата публикации. После чего, мы берем значение количества посещений страницы этой статьи, записываем в переменную и делаем несколько проверок.

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

Все готово, но наш код пока нигде не вызывается. Конечно, вы можете вызвать его напрямую из файла шаблона, но тогда он будет работать только с этим шаблоном и удалится после обновления. Намного удобней воспользоваться хуком «wp_head», находящимся в шапке практически каждого существующего шаблона. С ним наш код будет отрабатывать каждый раз, когда вызывается хук. Этот код нужно будет поместить в начало или конец предыдущего:

add_action ("wp_head", "came_tposts_add_view ");

Получаем и показываем количество просмотров

Для этих целей, проще всего воспользоваться вызовом стандартного «get_post_meta()», применявшегося для записи. Но лучше написать отдельную функцию, чтобы код был более гибким. Пишем вот так:

function came_tposts_get_view_count() {
global $post;
$cur_views = get_post_meta($post->ID, "came_tposts_views", true);
if(!isset($cur_views) OR empty($cur_views) OR !is_numeric($cur_views) ) {
$cur_views = 0;
}
return $cur_views;
}

С одной стороны, это дублирование кода, поскольку точно такие же строки были до этого, но данное решение пригодится в будущем. Например, можно будет добавить другую обработку нуля, а также обеспечить продолжение работы кода, если глобальный объект не доступен.

Мы получили значение количества просмотров, теперь остается передать его в шаблон. Вы можете решить, что нужно всего-навсего добавить в файл «single.php» строку «echo came_tposts_get_view_count() . «просмотров»;». Это действительно сработает, но отобразиться так как есть, без смены окончания при единичном числе. Согласитесь, это выглядит не очень красиво, поэтому лучше написать дополнительный код, чтобы учесть все возможные числовые варианты. Пишем так:

function came_tposts_show_views($before = "У этого поста: ") {
global $post;
$cur_views = came_tposts_get_view_count();
$views_text = $before . $cur_views . " ";
$n = $cur_views;
$plural = $n%10==1&&$n%100!=11?'просмотр':($n%10>=2&&$n%10<=4&&($n%100<10||$n%100>=20)?'просмотра':'просмотров');
$views_text .= $plural;
echo $views_text;
}

Список постов, основанный на популярности

Чтобы отобразить список статей, который будет строиться исходя из количества посещений их полных версий, нужно создать еще одну функцию, размещаемую в любом месте шаблона. Она будет обращаться к БД и отображать заголовки статей в списке. Пишем вот так:

function came_tposts_list($post_count = 10) {
$args = array(
"posts_per_page" => 10,
"post_type" => "post",
"post_status" => "publish",
"meta_key" => "came_tposts_views",
"orderby" => "meta_value_num",
"order" => "DESC"
);

$tposts_list = new WP_Query($args);

if($tposts_list->have_posts()) { echo "

    "; }

    while ( $tposts_list->have_posts() ) : $tposts_list->the_post();
    echo '

  • '.the_title('', '', false).'
  • ';
    endwhile;

    if$tposts_list->have_posts()) { echo "

";}
}

Как видите, сначала идет массив параметров, которые мы передадим классу «WP_Query», чтобы создать новый, содержащий посты, объект. Класс будет выполнять все основные действия: возьмет 10 постов из базы данных, имеющих наибольшее значение «came_tposts_views» в мета-таблице, и отсортирует их по мере уменьшения популярности.

Далее, если посты соответствуют всем критериям, мы создаем ненумерованный список, в котором будут находиться заголовки извлеченных статей, обернутые ссылкой на их полную версию. Теперь, размещение «came_tposts_list» в любом месте вашего шаблона будет генерировать список постов, отсортированных по популярности.

Чтобы обезопасить себя от возникновения ошибок, если расширение окажется выключенным, желательно указать условие, отображающее список только в том случае, когда существует «came_tposts_list»:

if (function_exists("came_tposts_list ")) {
came_tposts_list ();
}

Заключение

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

Похожие статьи

wordpresslib.ru


You May Also Like

About the Author: admind

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.