Создание простого плагина для WordPress

Друзья, привет-привет!

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

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

  • не придётся вносить изменения в файлы index.php, single.php, page.php и прочих, если автор определил самостоятельный вывод каждого типа страницы;
  • при обновлении или изменении темы не придётся править файлы;
  • если захотите временно или навсегда скрыть кнопки, достаточно деактивировать/удалить плагин.
  • Простейшая реализация плагина

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

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

    // функция добавляет кнопки расшаривания перед постом

    // код со страницы https://tech.yandex.ru/share/
    $data = "



    " ;// возвращаем новое содержимое - код от Яндекса + старое содержимое
    return $data . $content ;
    }

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

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

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

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

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

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

    add_filter ("the_content" , "yandexshare_run" );// функция добавляет кнопки расшаривания перед и после поста
    function yandexshare_run ($content ) {
    // получить сервисы для иконок
    // если ни одного сервиса не выбрано, будем использовать только основные
    ;// показывать ли большие иконки
    // непосредственно код Яндекс Share. Детали - https://tech.yandex.ru/share/
    // необходимые скрипты
    $script = "

    " ;
    // здесь учитываем желаемые иконки и их размер
    $data = "" ;// вывод данных: подключение скриптов единожды, блок кнопок до статьи,
    // статья и ещё один аналогичный блок кнопок
    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" ]) ? 0 : 1 ;// если установлено - добавляем в опции, иначе - удаляем,
    // т. к. значение по умолчанию и так ноль
    if ($bigbtn ) update_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

    // и оставляем значения по умолчанию
    $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 );
    ?>

    Настройки YandexShare





    Использовать большие кнопки





    Нет


    Убирать/отмечать произвольные сервисы можно с зажатой клавишей Ctrl





    // ... Вместо этой строки вставляем код счётчиков...