Хуки (hooks) — это мощный инструмент в WordPress, который позволяет разработчикам "подцеплять" собственный код к различным событиям и процессам системы. Они делятся на два типа: действия (actions) и фильтры (filters). Правильное использование хуков значительно упрощает автоматизацию задач, избавляет от ручной работы и повышает гибкость сайта.
Что такое хуки в WordPress и зачем они нужны
Хуки — это точки входа в ядро WordPress или в плагины и темы, где можно выполнить собственный PHP-код. Действия (actions) позволяют выполнить код в определённый момент, например, при сохранении записи, а фильтры (filters) дают возможность изменить данные перед выводом или сохранением.
Использование хуков — это лучший способ расширять функциональность WordPress без изменения исходного кода ядра. Это значит, что ваши изменения будут сохраняться при обновлениях, а код остаётся организованным и повторно используемым.
Например, вы можете автоматически отправлять уведомление на почту при публикации новой статьи, очищать кэш при обновлении поста или добавлять метаданные без ручного вмешательства.
Основные хуки для автоматизации в WordPress
Action hook save_post – автоматизация при сохранении записи
Хук save_post вызывается после сохранения поста любого типа. Его часто используют для запуска дополнительных процессов, например, обновления связанных данных или очистки кэша.
Пример автоматической генерации кастомного поля при сохранении поста:
function wpboot_save_post_auto_meta( $post_id ) {
// Проверяем, чтобы не было автосохранения
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
return;
}
// Проверяем права пользователя
if ( !current_user_can( 'edit_post', $post_id ) ) {
return;
}
// Добавляем или обновляем метаполе
update_post_meta( $post_id, '_wpboot_custom_meta', 'Автоматически добавленное значение' );
}
add_action( 'save_post', 'wpboot_save_post_auto_meta' );Такой код позволяет автоматически при сохранении записи добавить или обновить мета-данные, что удобно при интеграции с другими системами или для хранения служебной информации.
Action hook wp_insert_post — запуск после создания записи
Отличается от save_post тем, что вызывается сразу после создания записи, но до её публикации. Можно использовать для автоматической публикации, отправки уведомлений или запуска сложных процессов.
Пример отправки письма администратору при создании новой записи:
function wpboot_notify_admin_on_new_post( $post_id, $post, $update ) {
if ( $update ) return; // Только для новых записей
$admin_email = get_option( 'admin_email' );
$subject = 'Создана новая запись на сайте';
$message = 'Появилась новая запись: ' . get_the_title( $post_id );
wp_mail( $admin_email, $subject, $message );
}
add_action( 'wp_insert_post', 'wpboot_notify_admin_on_new_post', 10, 3 );Использование фильтров для автоматической обработки данных
Фильтр the_content — автоматическое изменение контента постов
Фильтр the_content позволяет изменить содержимое поста перед выводом на экран. Это удобно для добавления рекламных блоков, авторских сносок или динамического контента.
Пример добавления блока с призывом к действию в конце каждой записи:
function wpboot_add_cta_to_content( $content ) {
if ( is_singular( 'post' ) && in_the_loop() && is_main_query() ) {
$cta = '<div class="wpboot-cta"><p>Спасибо за прочтение! Подпишитесь на рассылку.</p></div>';
return $content . $cta;
}
return $content;
}
add_filter( 'the_content', 'wpboot_add_cta_to_content' );Фильтр excerpt_length — автоматическая настройка длины анонса
Иногда бывает нужно изменить длину стандартного анонса (excerpt) для разных типов страниц. Это можно сделать через фильтр excerpt_length.
function wpboot_custom_excerpt_length( $length ) {
if ( is_home() ) {
return 20; // Короткий анонс на главной
} elseif ( is_category() ) {
return 40; // Более длинный для категорий
}
return $length;
}
add_filter( 'excerpt_length', 'wpboot_custom_excerpt_length', 999 );Практические примеры автоматизации с помощью хуков
Автоматическое удаление ревизий при сохранении записи
Ревизии занимают место в базе данных и могут замедлять сайт. Можно автоматически удалять старые ревизии сразу после сохранения записи.
function wpboot_delete_old_revisions( $post_id ) {
global $wpdb;
$revisions = wp_get_post_revisions( $post_id );
foreach ( $revisions as $revision ) {
wp_delete_post_revision( $revision->ID );
}
}
add_action( 'save_post', 'wpboot_delete_old_revisions' );Автоматическое добавление метки "Новое" к свежим постам
Если пост опубликован менее 7 дней назад, можно автоматически добавить к его заголовку метку "Новое" с помощью фильтра the_title.
function wpboot_add_new_label_to_title( $title, $id = null ) {
if ( is_admin() || !$id ) {
return $title;
}
$post_date = get_the_date( 'U', $id );
if ( ( time() - $post_date ) <= 7 * DAY_IN_SECONDS ) {
$title .= ' <span style="color:red; font-weight:bold;">[Новое]</span>';
}
return $title;
}
add_filter( 'the_title', 'wpboot_add_new_label_to_title', 10, 2 );Какие плагины использовать для упрощения работы с хуками
Хотя хуки пишутся вручную, есть плагины, которые облегчают работу с ними:
- Code Snippets — удобный плагин для добавления пользовательских PHP-скриптов без правки файлов темы или плагинов.
- WP Crontrol — позволяет управлять планировщиком задач WordPress, что полезно при автоматизации с хуками и cron-задачами.
- Clearfy Pro — оптимизирует сайт и включает дополнительные хуки для расширенной автоматизации.
Для примера интеграции с Clearfy Pro можно автоматически отключать неиспользуемые функции через хуки, что повышает производительность.
Советы по безопасности при работе с хуками
При добавлении кода через хуки важно соблюдать безопасность:
- Проверяйте права пользователя с помощью
current_user_can(), чтобы избежать несанкционированных изменений. - Защищайте формы от CSRF с помощью nonce.
- Обрабатывайте и экранируйте входящие данные перед сохранением.
- Избегайте выполнения тяжелых операций в хуках, влияющих на скорость загрузки страниц.
Следование этим рекомендациям поможет избежать уязвимостей и сохранить стабильность сайта.