Конец plugin php. Плагины — Документация Webasyst. как создать свой плагин

  • 29.10.2019

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

Конечно, проще и привычнее пойти традиционным путем и тупо вставить сниппет в файл functions.php вашей активной темы. Но в 9 из 10 случаев будет целесообразнее и правильнее вынести код сниппета в отдельный плагин . В крайнем случае, добавить его в специальный функциональный плагин вашего сайта. Т.н. Site-Specific WordPress Plugin , в котором-то и будет храниться весь дополнительный функционал вашего сайта.

Зачем это нужно

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

Как же быть

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

Создаем специальный плагин функций WordPress

На самом деле, все делается очень просто.

  • В директории плагинов вашего WordPress создаете папку. Например: /wp-content/plugins/mysite-plugin/ ;
  • Создаете в этой папке файл, назвав его, к примеру, my-plugin.php ;
  • Вставляете в этот файл примерно такой код:
  • Переходите в настройки управления плагинами и активизируете свой новый плагин.

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

На этом можно и остановиться, но с моей стороны было бы не совсем правильно не упомянуть про т.н. MU-плагины .

MU-плагины (Must Use Plugins)

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

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

Преимущества MU-плагинов
  • MU-плагины не нужно активировать, они всегда активны, их невозможно отключить в консоли управления сайтом;
  • MU-плагин подключается и активируется банальной закачкой файла плагина в директорию mu-plugins;
  • MU-плагины загружаются в алфавитном порядке перед загрузкой обычных плагинов.

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

В заключение

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

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

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

  • Текстовый редактор

Для выполнения шагов этого руководства вам понадобиться текстовый редактор, например, Notepad++ или среда разработки NetBeans . Также вам нужен доступ по FTP в вашей учётной записи на хостинге и .

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

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

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

Поскольку плагин WordPress это отдельный код, он не пересекается непосредственно с какой либо частью кода ядра WordPress. Плагин может быть скопирован или установлен на любую установку WordPress. Альтернативный (и очень не рекомендуемый) путь внесения изменений в WordPress – написание новой функции в файл WordPress functions.php , который находится в каталоге /wp-includes/ или в файл functions.php , который является частью вашей темы. Это может привести к ряду возможных проблем.

WordPress и его темы регулярно обновляются. И пока вы используете дочернюю тему WordPress , очередное обновление будет перезаписывать файл functions.php , а добавленный вами новый код будет удален и придётся его добавлять снова и снова. Ещё один неудобный момент может возникнуть, если вы напишете много функций и в одной из них будет ошибка, которую вы никак не может отследить, вам может потребоваться заменить текущий файл оригинальным, однако при этом придётся пожертвовать всеми остальными функциями. Это повлечёт за собой большое количество PHP-ошибок на сайте, потому как вызовы уже удалённых функций ещё будут осуществляться из других мест.

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

Что такое хук (hook)?

Плагины WordPress взаимодействуют с кодом ядра через так называемые хуки (hooks , от англ. hook – крючок). К ним, как к крючкам можно “цеплять” выполнение каких-либо интересных нам функций. В WordPress есть два вида хуков:

  • Action hooks или хуки-события (добавить/удалить пользовательскую функцию к некоторому событию).
  • Filter hooks или хуки-фильтры (для изменения данных, обрабатываемых функциями).
  • События и Хуки-события

    Посещение любой страницы WordPress-сайта – это вызов множества функций PHP (называемых событиями – actions ). Функции привязываются к хукам-событиям (action hooks) . Механизм хуков-событий предоставляется WordPress. Вы можете добавлять свои функции к какому-либо событию из списка событий, используя механизм хуков и они будут запускаться по запуску этого события. Вы также можете удалять уже существующие функции из любого списка хуков-событий. Хуки-события привязаны к выполнению определённого события. Например, перед закрытием тега на любой странице, вызывается хук-событие wp_head() и запускается ряд функций, которые привязаны к этому хуку wp_head() .

    Добавление функций на хук события, используя add_action()

    Чтобы добавить функцию на любой хук-событие, ваш плагин WordPress должен вызвать функцию WordPress под названием add_action() , как минимум с двумя параметрами.

    // Хук события "init", вызывается после того, как WordPress завершает загрузку кода ядра add_action("init", "add_Cookie"); // Установка cookie с текущим временем дня function add_Cookie() { setcookie("last_visit_time", date("r"), time()+60*60*24*30, "/"); }

    • хука-события (action hook) , к которому собираемся связать свою функцию.
    • Второй обязательный параметр – имя функции (function) , которую будем запускать.
    • приоритет (priority) функции, которую вы собираетесь запустить. Вы можете привязать сколько угодно функций к одном хуку события и обращаться к ним в любом порядке. Приоритет запуска по умолчанию – 10, ваша функция запускается сразу после встроенных функций WordPress. Функция с приоритетом 11 запустится следующей и так далее.
    • количество аргументов , означает сколько параметров ваша пользовательская функция может принять. По умолчанию количество параметров равно 1.
    Пример кода плагина для отображения текста после раздела футера (footer) на каждой странице

    Этот плагин WordPress перехватывает хук-событие wp_footer() , который вызывается сразу перед закрытием тега на каждой странице и добавляет новую функцию под названием mfp_Add_Text() . Так как плагин WordPress не привязывается к теме, то функционал будет работать даже при смене темы на другую. Можете сохранить себе этот пример в файл PHP, загрузить его в каталог wp-content/plugins/ и активировать в Админ Консоли, чтобы увидеть изменения.

    Вот результат:

    Примечание: PHP загружает содержимое сразу всего скрипта перед его выполнением, это значит, что вы можете вызвать add_action() перед определением вашей функции: вызвать add_action() с вашими функциями вначале файла в том порядке, в котором они будут загружаться, потом определить ваши функции в таком же порядке ниже. Такое структурирование кода сделает файл более лёгким для чтения.

    Удаление функций из хуков-событий, используя remove_action()

    Для удаления функции, связанной с хуком-событием, нужно воспользоваться remove_action() . Пример ниже поможет понять принцип работы добавления и удаления функций в/из хука событий.

    // Хук на событие "init", который вызывается после завершения загрузки ядра WordPress и функция "remove_My_Meta_Tags" add_action("init", "remove_My_Meta_Tags"); // Удаляем функцию "add_My_Meta_Tags" из хука-события wp_head function remove_My_Meta_Tags() { remove_action("wp_head", "add_My_Meta_Tags"); }

    Запускается remove_action() как минимум в двумя параметрами.

    • Первый обязательный параметр – название хука-события (action hook) , к которому функция была прикреплена
    • Второй обязательный параметр – это имя функции (function) , которую вы хотите удалить
    • Третий (необязательный) параметр – это приоритет удаляемой функции. Этот параметр должен совпадать с тем приоритетом, который был задан при добавлении события к хуку событий. Если он не был определён, не включайте этот параметр.

    Пример: представим, что вы хотите, чтобы текст, добавленный в футере в предыдущем примере, не выводился по понедельникам. Один из путей реализации этого, использовать функцию даты в PHP, чтобы получить текущий день недели, проходя условным оператором if…then… и проверяя соответствует ли текущий день понедельнику, затем вызвать remove_action(), если это понедельник. Вызываем функцию проверки и удаления по дню недели при помощи add_action() , прикрепляясь к событию, происходящему раньше (например, wp_head ), чем то, к которому прикреплено наше основное действие выведения текста в футере (wp_footer) . Если мы выберем событие происходящее позже, чем wp_footer , удаления не произойдёт, поскольку страница уже будет сгенерирована.

    Фильтры и хуки-фильтры

    Функции фильтры позволяют изменять возвращаемые другими функциями данные и должны быть прежде перехвачены при помощи хуков-фильтров . Хуки-фильтры несколько отличаются от хуков-событий. Однако, работают они подобно хукам-событиям – могут быть вызваны в разных точках скрипта и контекстно. Полный список хуков-фильтров и контекста вызова можно найти на WordPress Plugin API/Filter Reference page.

    Добавление фильтров, используя add_filter()

    Чтобы добавить любую функцию к хуку-фильтру, ваш плагин должен вызвать функцию WordPress под названием add_filter() , с как минимум двумя параметрами.

    // Перехват хука-фильтра "the_content" (содержимое любого поста), запуск функции "mfp_Fix_Text_Spacing" add_filter("the_content", "mfp_Fix_Text_Spacing"); // Автоматическое исправление двойного пробела function mfp_Fix_Text_Spacing($the_Post) { $the_New_Post = str_replace(" ", " ", $the_Post); return $the_New_Post; }

    • Первый обязательный параметр – это название хук-фильтра (filter hook) , на который хотим повесить функцию.
    • Второй параметр – это имя функции фильтра (filter function), которую хотим запустить.
    • Третий параметр (необязательный) – это приоритет (priority) функции, которую вы хотите запустить. В хуку-фильтру можно добавить сколько угодно разных фильтров функций. Приоритет по умолчанию – 10, устанавливает очередь вашей пользовательской функции после любой встроенной функции. Функция с приоритетом 11 запустится следующей и так далее.
    • Четвёртый параметр (необязательный) – это количество аргументов , который означает сколько параметров ваша пользовательская функция может принять. По умолчанию количество параметров равно 1.
    Пример. Плагин WordPress для изменения фрагмента/выдержки записи

    В WordPress есть функция, которая извлекает отрывок (цитату) из записи, называется она get_the_excerpt() , и также является хуком-фильтром. Функция, отображающая отрывок, вызывает get_the_excerpt(), чтоб его получить, это то место, где применяется фильтр и отрывок изменяется до отображения. Этот плагин WordPress определяет функцию фильтр, которая берёт отрывок текста как входной параметр, добавляет некоторый текст вначале него и возвращает новое значение каждый раз, когда вызывается get_the_excerpt() . Так как возвращаемое функцией get_the_excerpt() значение – это фактический фрагмент текста, он автоматически вводится как параметр функции $old_Excerpt, когда вызывается, используя add_filter(). Функция, которую вы определяете должна вернуть новое значение .

    Итоговый результат:


    Удаление фильтров, используя remove_filter()

    Для удаления фильтра нужно просто вызвать функцию remove_filter() . Например, добавим снова простое условие и будем удалять текст, если сегодня четверг.

    // Хук-фильтр get_the_excerpt, запуск функции mfp_Add_Text_To_Excerpt add_filter("get_the_excerpt", "mfp_Add_Text_To_Excerpt"); // Если сегодня четверг, удалить фильтр the_excerpt() if (date("l") === "Thursday") { remove_filter("get_the_excerpt", "mfp_Add_Text_To_Excerpt"); } // Взять отрывок, добавить текст и вернуть новый отрывок function mfp_Add_Text_To_Excerpt($old_Excerpt) { $new_Excerpt = "Excerpt: " . $old_Excerpt; return $new_Excerpt; }

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

    Шаг 1 – Сохранение плагина

    Первым шагом в создании плагина для WordPress является создания каталога для хранения всех файлов. Все плагины хранятся в каталоге: /wp-content/plugins/ . Каталог, который вы создаёте должен иметь уникальное и понятное название, не пересекающееся с другими плагинами. Поключитесь к своему аккаунту на хостинге по FTP . Из основного каталога WordPress перейдите в wp-content потом в plugins . Внутри каталога plugins создайте новый каталог с названием my-first-plugin .


    Отдельные файлы с кодом плагина лучше тематически разделять по подкаталогам внутри основного каталога плагина вместо того, чтобы хранить всё в одном каталоге, это позволит не путаться и будет хорошим смысловым разделением исходных файлов плагина. Особенно разделение файлов по смыслу будет хорошо ощутимо, когда ваш плагин будет разрастаться и становиться более сложным. Если ваш плагин использует свои стили CSS создайте каталог CSS и сохраните туда все файлы CSS. Если ваш плагин WordPress использует JavaScript создайте каталог JavaScript .

    Шаг 2 – Создание первого файла

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

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

    Готовый код:

    Add_filter("widget_text"," text_html_php_widget ",100); function text_html_php_widget($text) { if(strpos($text,"".$text); $text = ob_get_contents(); ob_end_clean(); } return $text; }

    Первая строка является фильтром, который заменяет при каждом вызове стандартную функцию текстового виджета на новую – text_html_php_widget, а далее идет описание самой новой функции.

    Зачем PHP код в статьях и постах WordPress

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

    Но и в постах бывает потребность использования скриптов. Самый частый пример – это вывод карты сайта без плагина. Правда, для карты можно использовать другой приём – сделать специальный шаблон страницы (это отдельная тема).

    Мне однажды понадобилось выводить PHP для следующей цели:

    Делал я видео сайт. Серии сериала выводились в плейлистах по сезонам и надо было под каждым плейлистом сезона вывести список серий со ссылкой на свою страницу. Похоже на карту сайта, только сложнее – вывод делать надо было списками отдельных рубрик. Можно было вручную HTML кодом каждую ссылку прописать, но там несколько сот серий и процедура муторная. Тем более, при появлении новой серии ссылку на нее пришлось бы добавлять вручную – неудобно. Вот я и решил использовать PHP функции для реализации.

    Плагин для исполнения PHP в контенте Exec-PHP

    Несмотря на то, что этот плагин не обновлялся уже 7 лет, он прекрасно справляется с обязанностями. И я его выбрал не просто так – он не использует никаких шорткодов, как конкуренты, а дает возможность вставлять в записи WordPress код в чистом виде, начиная с .

    Плагин Exec-PHP есть в репозитарии и устанавливается через меню в админке движка.

    Из настроек есть только одна – разрешение/запрет на исполнение кода в текстовом виджете, возможности отключить работу в постах и на страницах отсутствует, если надо ее убрать – деактивируем плагин.

    Для вставки PHP кода в статью, должен быть переведен в HTML режим (вкладка «Текст»). Визуальный режим, скорее всего, код попортит.

    Выполнение PHP кода в статьях WordPress без плагина

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

    Как работать с описанной ниже функцией

  • Вставляем ее в файл functions.php темы;
  • В нужном месте статьи вставляем конструкцию – исполняемый код без
  • Функция:

    /* Запуск php в статьях и страницах WordPress: код */ function start_php($matches){ eval("ob_start();".$matches."$inline_execute_output = ob_get_contents();ob_end_clean();"); return $inline_execute_output; } function inline_php($content){ $content = preg_replace_callback("/\((.|\n)*?)\[\/startphp\]/", "start_php", $content); $content = preg_replace("/\((.|\n)*?)\[\/startphp\]/", "$1", $content); return $content; } add_filter("the_content", "inline_php");

    Недостаток

    Если внутри вставляемого PHP кода есть HTML вставки или текст, то он работать не будет. Любой текст или теги придется вставлять с помощью команды echo, что не всегда удобно. То есть, код должен быть чисто PHP-шный на 100 правильного формата.

    Правильно

    Echo "Так работать будет";

    Неправильно

    Echo "Эта строка правильная"; Так работать не будет

    В плагине Exec-PHP такой заморочки нет – и текст и HTML исполнятся, но все элементы PHP кода должны быть обрамлены в соответствующие теги.

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

    Это главный файл в вашей теме WordPress. Располагается в /wp-content/themes/{тут название вашей темы}/functions.php .
    В нём определяются важные свойства темы, кастомизируются хуки, внешний вид и её функциональность, а также добавляются некоторые необходимые вам функции. Этот файл загружается каждый раз при открытии любой страницы WordPress, поэтому с его помощью можно изменить любой элемент сайта. В связи с этим, многие советы а-ля «как изменить что-то в WordPress без плагинов » часто касаются именно внесения изменений в functions.php, вместо того, чтобы создать под этот функционал отдельный плагин или воспользоваться готовым решением. Зачастую это приводит к информационной перегрузке этого файла, код становится тяжело разобрать, а внести исправления ещё сложнее. Но не это самое опасное. Самое опасное — это то, что при смене активной темы пропадёт часть или весь необходимый функционал сайта .

    Чем отличается functions.php от плагина

    Ничем. По своей сути, functions.php и есть эдакий глобальный неотключаемый плагин, который привязан к текущей теме. Как он подключается в WordPress, можно посмотреть в wp-settings.php . Как видно из исходного кода, его загрузка происходит после всех плагинов, однако, это не даёт никаких недостатков или преимуществ, разве что возможность переопределить что-то в подключенных плагинах. На скорость исполнения кода это также никак не повлияет. Влияет только содержание плагинов и functions.php. Поэтому, будьте внимательны при выборе активных плагинов для своей темы и откажитесь от ненужных, малополезных вам, тогда вы сможете облегчить ваш сайт и ускорить его работу.

    Когда нужно использовать functions.php

    Руководствуйтесь следующим правилом: если функционал напрямую связан с текущей темой, но не с работой сайта, записывайте его в functions.php.

    К примеру, это может быть

    • Настройка миниатюр
    • Установка размеров сайдбаров
    • Настройка мест под виджеты
    • Объявление мест под навигационное меню
    • Настройки темы
    • Дополнительные функции вашей темы
    Когда стоит избегать использования functions.php

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

    • Определение счётчиков посещаемости (Google Analytiсs, Yandex.Metrika, Liveinternet)
    • Настройка дополнительного функционала админки (например, )
    • Конфигурирование исходного кода ()
    • Определение шорткодов
    • Регистрация

    Списки неполные, вы можете определить их содержание сами под себя.

    Куда внести данный код, если не в functions.php? Вы можете написать специальные плагины под них, однако, есть способ интереснее и проще.

    mu-plugins как альтернатива functions.php

    К нам в современные версии WordPress из WordPress MU(Multi-User) пришёл интересный функционал, называемый MU Plugins . Суть его заключалась в следующем. Администратору WordPress MU порой требовалось определить плагины для всей сети сайтов. Обычным функционалом этого было не добиться, поэтому ввели специальный раздел: /wp-content/mu-plugins/ , где они и определялись. Ещё что интересно, файлы плагинов из этой директории загружаются раньше всех остальных, что даёт возможность предопределить некоторые константы или настройки.
    Позже WPMU упразднили, его код интегрировали с основным блоговым, и теперь любой WordPress может использовать функционал MU-plugins, который теперь расшифровывается как Must Use , то есть обязательный к использованию.

    Как использовать mu-plugins

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

    Здесь для примера создан файл с кодом счётчиков посещаемости.
    Внутри этот файл выглядит вот так

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