Хуки (actions) и фильтры (filters) — это фундаментальные механизмы расширения функционала WordPress без изменения исходного кода ядра. Правильное использование хуков и фильтров позволяет создавать мощные и гибкие плагины, которые легко поддерживать и масштабировать.
Что такое хуки и фильтры в WordPress
Хуки — это точки в коде WordPress, где можно «подцепить» свою функцию и выполнить дополнительный код. Они бывают двух типов: actions и filters.
Actions — позволяют выполнить функцию в определённый момент, например, при сохранении поста, загрузке страницы или отправке формы.
Filters — дают возможность изменить данные перед выводом или обработкой. Например, можно изменить заголовок поста или содержимое перед показом пользователю.
Используя хуки и фильтры, разработчик может внедрять свой код в стандартные процессы WordPress без изменения ядра, что обеспечивает стабильность и совместимость.
Использование действий (actions) в плагинах WordPress
Для добавления действия используется функция add_action(). Она принимает два обязательных параметра: имя хука и имя вашей функции. Рассмотрим пример подключения функции к хуку init, который вызывается при инициализации WordPress.
function wpplugin_init_function() {
// Ваш код инициализации
error_log('WPPlugin: Инициализация плагина');
}
add_action('init', 'wpplugin_init_function');В этом примере функция wpplugin_init_function будет вызвана при загрузке WordPress. Это удобно для регистрации кастомных типов записей, таксономий и других задач.
Другой пример — добавление действия при сохранении поста:
function wpplugin_save_post_callback($post_id) {
// Проверяем, чтобы это не автосохранение
if (wp_is_post_autosave($post_id)) {
return;
}
// Дополнительные действия при сохранении
error_log('WPPlugin: Пост сохранён, ID: ' . $post_id);
}
add_action('save_post', 'wpplugin_save_post_callback');Фильтры: изменение данных перед выводом
Фильтры позволяют перехватывать и изменять данные. Для их подключения используется функция add_filter(). Например, изменим заголовок поста перед отображением:
function wpplugin_filter_the_title($title) {
return 'WPPlugin: ' . $title;
}
add_filter('the_title', 'wpplugin_filter_the_title');Теперь ко всем заголовкам постов будет добавляться префикс «WPPlugin:». Это простой способ модифицировать вывод без изменения шаблонов.
Фильтры можно использовать и для более сложных задач, например, изменения содержимого поста, настройки параметров запросов и т.д.
Приоритет и количество аргументов в хуках и фильтрах
При добавлении хуков и фильтров можно указать приоритет выполнения функции и количество принимаемых аргументов. Это важно, когда несколько функций подключены к одному хуку.
Синтаксис:
add_action('hook_name', 'function_name', $priority, $accepted_args);
add_filter('hook_name', 'function_name', $priority, $accepted_args);По умолчанию $priority равен 10, а количество аргументов — 1.
Пример с приоритетом 20 и двумя аргументами:
function wpplugin_custom_filter($content, $post) {
// Изменяем содержимое поста
return $content . '<p>Дополнительный текст для поста ID ' . $post->ID . '</p>';
}
add_filter('the_content', 'wpplugin_custom_filter', 20, 2);Практическое применение: регистрация кастомного типа записи с использованием хуков
Создадим простой плагин, который регистрирует кастомный тип записи «Отзывы» с помощью действия init:
function wpplugin_register_reviews_post_type() {
$labels = array(
'name' => 'Отзывы',
'singular_name' => 'Отзыв',
'add_new' => 'Добавить отзыв',
'add_new_item' => 'Добавить новый отзыв',
'edit_item' => 'Редактировать отзыв',
'new_item' => 'Новый отзыв',
'view_item' => 'Просмотреть отзыв',
'search_items' => 'Поиск отзывов',
'not_found' => 'Отзывы не найдены',
'not_found_in_trash' => 'В корзине отзывы не найдены',
'menu_name' => 'Отзывы'
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'supports' => array('title', 'editor', 'author', 'thumbnail'),
'show_in_rest' => true
);
register_post_type('wpplugin_reviews', $args);
}
add_action('init', 'wpplugin_register_reviews_post_type');Этот код регистрирует новый тип записи с поддержкой редактора Gutenberg, миниатюр и автора. Благодаря хуку init регистрация происходит на этапе инициализации WordPress.
Советы по отладке и написанию хуков
Для отладки хуков удобно использовать функцию error_log(), чтобы писать сообщения в лог сервера. Это помогает понять, вызывается ли ваша функция, и в каком порядке.
Используйте префиксы в именах функций, чтобы избежать конфликтов с другими плагинами и темами. Например, используйте префикс wpplugin_ для всех своих функций.
Не забывайте проверять условия в функциях, например, исключать автосохранения или проверки nonce, если это необходимо.
Примеры полезных плагинов с расширенным использованием хуков и фильтров
На сайте WPSHOP можно найти ряд плагинов, которые грамотно используют хуки и фильтры для расширения возможностей WordPress. Например:
- Clearfy Pro — оптимизация и настройка WordPress через фильтры.
- WPStories — создание интерактивных историй с помощью действий и фильтров.
Изучение их исходного кода поможет лучше понять, как использовать хуки для решения практических задач.