Понятие пространства имен в системе хуков в WordPress

Понятие пространства имен в системе хуков в WordPress

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

Как прицепить методы объекта

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

Вы могли бы создать класс AdManager с парой методов, в которых будет храниться код нескольких рекламных сетей.

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

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

Чтобы прицепить метод adsense к экшену before_post_content снаружи класса (возможно, в файле functions.php активной темы) для отображения рекламы Google AdSense еще до загрузки контента поста, вам придется заменить $this на экземпляр класса.

Скажем, в классе есть метод, возвращающий экземпляр класса по шаблону singleton.

Тогда метод adsense можно прицепить к экшену before_post_content следующим образом.

Пространства имен

Система хуков в WP разрабатывалась в то время, когда в WP еще не было пространства имен. Вы можете заметить, что прицепить функции с пространством имен и методы классов к экшенам и фильтрам довольно сложно. Скажем, у класса AdManager пространство имен SitePoint\Plugin.

Чтобы прицепить метод adsense класса AdManager к экшену before_post_content, необходимо добавить перед именем класса пространство имен:

Если класс и вызов функции add_action прописаны в пространстве имен SitePoint\Plugin\ одного файла, дописывать пространство имен к имени класса нет необходимости, так как все находится в рамках одного пространства имен. С примерами классов закончили, давайте взглянем на функцию. К примеру, у вас есть следующая функция с пространством имен, которую необходимо прицепить к экшену wp_head.

Прицепить функцию можно, добавив к названию функции пространство имен:

Мой кошмар с пространством имен и системой хуков

В своем плагине Admin Bar & Dashboard Access Control я зарегистрировал хук удаления, который удаляет настройки после удаления плагина.

Что-либо простое наподобие строки ниже сделать легко. PP_Admin_Bar_Control – имя класса, а on_uninstall – метод, вызываемый во время удаления.

Чтобы проверить работу хука, я попробовал удалить плагин и посмотреть, удалились ли настройки. К моему удивлению я получил следующую ошибку: The plugin generated 2137 characters of unexpected output during activation.

Посмотрите, как задан класс и функция register_uninstall_hook в пространстве имен ProfilePress\PP_Admin_Bar_Control.

Видите причину, почему не сработал метод on_uninstall во время удаления плагина? Вам может показаться, что если функция register_uninstall_hook находится в пространстве имен, то и класс будет в нем. Не в этом случае. Необходимо все так же добавлять перед названием метода пространство имен.

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

Заключение

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

Надеюсь, мне удалось снять покров таинственности с системы хуков в WP. Если у вас есть вопросы, или вам есть, что сказать, пишите об этом в комментариях.

Автор: Agbonghama Collins

Источник: //www.sitepoint.com/

Редакция: Команда webformyself.

Метки:

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

Комментарии Вконтакте: