Создание простого плагина для WordPress. Когда может пригодится использовать mu плагины? Материал доступен только подписчикам

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

Must-use plugins (mu-plugins) - обязательные к использованию плагины - это плагины, которые устанавливаются в специальную папку /wp-content/mu-plugins . Они активируются автоматически (т.е. всегда активны) для сайта и сайтов сети.

mu-plugins отображаются в верхней информационной строке в админ-панели.

Их невозможно отключить через админку. Для отключения нужно удалить файл плагина из упомянутого каталога wp-content/mu-plugins .

WordPress автоматически подключает все файлы из папки mu-plugins , но не проверяет вложенные папки, где могут быть и другие php файлы. Поэтому такие плагины не могут находится в папках - это должен быть файл в папке wp-content/mu-plugins . Подключение файлов из вложенных папок должно прописываться вручную в файле из основной папки.

Изменение каталога MU плагинов

Каталог Обязательных плагинов можно изменить. Для этого нужно определить константы: WPMU_PLUGIN_DIR и WPMU_PLUGIN_URL в файле wp-config.php .

Плюсы и минусы Плюсы «необходимых» плагинов

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

    Легко подключать и активировать , для этого просто нужно добавить файл плагина в каталог wp-content/mu-plugins .

  • Загружаются на раннем этапе загрузки WordPress - до того, как загрузятся обычные плагины. Файлы подключаются в алфавитном порядке.
Недостатки «необходимых» плагинов

Чаще всего нет необходимости использовать эти плагины, потому что обычные плагины удобнее.

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

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

    WordPress ищет php файлы в каталоге my-plugin и делает это не так как для обычных плагинов - не просматривает файлы внутри вложенных папок. В этом случае, нужно будет создать загрузочный файл в каталоге my-plugin, чтобы он подключал файлы из подкаталогов, вот так:

    // mu-plugins/load.php require WPMU_PLUGIN_DIR ."/my-plugin/my-plugin.php";

Когда может пригодится использовать mu плагины?

В случаях, когда это удобнее обычного плагина... Я, например, недавно поместил код в виде такого плагина, чтобы установить 301 редиректы со старых URL, когда изменял ЧПУ на уже давно рабочем сайте. Это показалось мне наилучшим решением, ведь:

  • вставлять такой редирект в тему неправильно - вдруг тему изменят и все редиректы исчезнут....
  • если установить как обычный плагин, то если случайно его отключить все редиректы пропадут, а этого можно не заметить.
Как это работает?

MU плагины загружаются раньше обычных. Давайте посмотрим схему загрузки WordPress. Тут упомяну интересную картинку (очень она мне понравилась):

Схема загрузки WordPress

Что касается кода, как конкретно подключаются файлы. Смотрите фрагмент кода отвечающий за MU плагины, из файла темы wp-settings.php:

// Загружаем MU плагины. foreach (wp_get_mu_plugins() as $mu_plugin) { include_once($mu_plugin); } unset($mu_plugin); function wp_get_mu_plugins() { $mu_plugins = array(); if (!is_dir(WPMU_PLUGIN_DIR)) return $mu_plugins; if (! $dh = opendir(WPMU_PLUGIN_DIR)) return $mu_plugins; while (($plugin = readdir($dh)) !== false) { if (substr($plugin, -4) == ".php") $mu_plugins = WPMU_PLUGIN_DIR . "/" . $plugin; } closedir($dh); sort($mu_plugins); return $mu_plugins; }

Как мы видим, директория WPMU_PLUGIN_DIR проверяется на существование. Если она существует из неё собираются все.php файлы, сортируются по алфавиту (по возрастанию) и последовательно подключаются.

История появления Must-Use плагинов

Изначально каталог "mu-plugins" был создан для плагинов сети WPMU (Multi-User), чтобы дать возможность администраторам активировать плагины для всей сети сайтов или блогов. На тот момент эта функция была необходима, из-за специфики Мультисайтовой сборки: администраторы не могли активировать плагины для всей сети из админ-панели. С версии 2.8 это стало возможно.

Код отвечающий за multi-user-plugins (mu-plugins), был перенесен в основной код WordPress. А незадолго до этого база кода wpmu была объединена с основной сборкой WordPress и все сайты, независимо от сборки, получили возможность автоматически загружать плагины, и стало неважно простой это WP или WP-Multisite. Такая возможность более удобна для всех видов установок WordPress и для разных ситуаций связанных с созданием сайта.

В результате этого изменения название "mu-plugins" перестало соответствовать действительности, потому что теперь mu-plugins работали и для обычной сборки. Префикс "mu" больше не значил, что эта функция относится к многопользовательской сборке - WPMU. Несмотря на это, название решили оставить, но интерпретировать его иначе "Must-use plugins" (плагины обязательного использования). Т.е. это необходимые плагины - плагины, который всегда должны использоваться. Они работают для всех сайтов и не зависят от плагинов в админ-панели.

С PHP было нечто похожее: когда-то аббревиатура PHP означала "Personal Home Page", но затем была пере-интерпретирована как "PHP Hypertext Preprocessor" и, в духе хакерский традиций, превратилась в рекурсивный акроним.

Рекурсивный акроним - аббревиатура (акроним), который ссылается на себя.
В среде компьютерных хакеров стало традиционным выбирать акронимы (аббревиатуры, которые произносятся не по буквам), которые косвенно или напрямую ссылаются на себя. Одним из самых ранних примеров является появившаяся в 1977 TINT: «TINT Is Not TECO» («TINT - это не TECO»).

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

Надеюсь, смогу доступно донести информацию не только для специалистов в 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





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

    Есть вопросы?

    Сообщить об опечатке

    Текст, который будет отправлен нашим редакторам: