Хуки и фильтры

Дата публикации:Ноябрь 26, 2010

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

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

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

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

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

Объявление хуков и фильтров имеет следующий вид:

add_action($tag, $function_to_add, $priority, $accepted_args);
add_filter($tag, $function_to_add, $priority, $accepted_args);

Здесь $tag — это параметр, определяющий название хука; $function_to_add — имя функции, подцепленной к хуку. Следующие два параметра являются необязательными: $priority определяет приоритет действия в списке действий хука (если для данного хука определены несколько действий): чем больше число, тем позднее произойдет действие, $accepted_args — количество параметров для передачи функции.

Remove_filter позволяет «отцепить» действие или фильтр от какого-либо хука. Вызвать remove_filter напрямую нельзя. Перед этим необходимо сцепить его с хуком init, который запускается при загрузке WordPress. Задерживая выполнение нашей функции remove_some_filter, мы гарантируем, что действие, которое мы пытаемся удалить, было добавлено; иначе мы столкнулись бы с ошибкой. Пример использования remove_filter:

function remove_some_filter() {
remove_filter(tag, function, priority, args);
}add_action('init', 'remove_some_filter')

Примечания: 1). Если вы определяли для хука или фильтра приоритет, то для того, чтобы удалить хук, вам также придется использовать указанный приоритет, иначе WordPress ничего не удалит и оставит вас в неизвестности, почему так произошло. 2). remove_action и remove_filter выполняют одно и то же действие, поэтому мы не будем различать их. Не важно, что именно мы удаляем, действие или фильтр, мы будем использовать remove_filter.

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

Добавление favicon

Давайте рассмотрим простой пример, иллюстрирующий использование хуков для модификации темы. Favicons — это небольшие значки, которые отображаются во вкладках, истории, заголовках и закладках вашего браузера. Почему бы не добавить favicons к собственной теме? Помимо стандартных небольших иконок, вы могли бы добавить крупные иконки для устройств iPhone, iPad и iPod.

Первое, с чего мы начнем, это создадим свой favicon. Сделать это можно в любом графическом редакторе. Назовем иконку favicon.ico и загрузим ее в директорию с темой. Затем к файлу functions.php добавим простую функцию, которая создаст ссылку на месторасположение favicon. В процессе составления URL мы воспользуемся функцией get_bloginfo:

function wicked_favicon() {
echo '
';
}

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

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

add_action('wp_head', 'wicked_favicon'); 

Поскольку порядок ссылок в head не играет никакой роли, нам не потребуется указывать их приоритет; наша функция wicked_favicon() не принимает никаких параметров, следовательно, определять $accepted_args также не нужно.

Та же самая техника используется для подключения дополнительных стилевых таблиц или файлов javascript — что-либо, что должно размещаться в блоке head, подцепляется к wp_head.

Хуки фреймворка Thematic

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

  • thematic_before
  • thematic_aboveheader
  • thematic_header
    • thematic_brandingopen
    • thematic_blogtitle
    • thematic_blogdescription
    • thematic_brandingclose
    • thematic_access
  • thematic_belowheader
  • thematic_abovecontent
  • thematic_abovepost
  • thematic_belowpost
  • thematic_abovecomments
  • thematic_belowcomments
  • thematic_abovecommentslist
  • thematic_belowcommentslist
  • thematic_abovetrackbackslist
  • thematic_belowtrackbackslist
  • thematic_abovecommentsform
  • thematic_belowcommentsform
  • thematic_show_subscription_checkbox
  • thematic_show_manual_subscription_form
  • thematic_abovemainasides
  • thematic_betweenmainasides
  • thematic_belowmainasides
  • thematic_abovefooter
  • thematic_after

Визуальное представление областей, за которые отвечают данные хуки, можно найти на сайте: http://bluemandala.com/thematic/thematic-structure.html.

Поделиться

Оставить комментарий

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

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

Предыдущая запись:

Следующая запись: