В работе с WordPress хуки — это мощный инструмент, который позволяет изменять поведение системы без правки исходного кода ядра, тем самым сохраняя возможность обновлений. Особенно часто хуки применяются для управления процессом создания, обновления и отображения записей (постов). В этой статье мы подробно разберем, как использовать хуки WordPress для эффективного контроля записей, приведем примеры кода и рассмотрим популярные сценарии.
Что такое хуки WordPress и почему они важны для контроля записей
Хуки делятся на два основных типа: actions (действия) и filters (фильтры). Actions позволяют выполнять произвольный код в определенные моменты работы WordPress, а filters дают возможность изменять данные перед их использованием.
Когда речь идет о записях, хуки позволяют вам вмешиваться в процесс сохранения, отображения, изменения контента и метаданных записей. Это дает гибкий контроль и возможность расширять функционал без дублирования кода.
Например, вы можете автоматически менять заголовок записи при сохранении, блокировать публикацию при определенных условиях или изменять вывод контента на фронтенде.
Основные хуки для работы с записями в WordPress
Для контроля записей чаще всего используются следующие хуки:
save_post— вызывается при сохранении записи.wp_insert_post_data— фильтр для изменения данных записи перед сохранением.the_content— фильтр для изменения контента записи при выводе.pre_get_posts— действие для модификации запроса WordPress перед выборкой записей.transition_post_status— действие, вызываемое при смене статуса записи (например, из черновика в опубликованную).
Далее рассмотрим, как использовать эти хуки на практике.
Как изменить данные записи перед сохранением с помощью wp_insert_post_data
Иногда необходимо автоматически корректировать данные записи, например, добавлять префикс к заголовку или менять содержимое.
Хук wp_insert_post_data позволяет изменить массив данных записи перед тем, как WordPress сохранит их в базу.
Пример: Добавление префикса к заголовку записи
function cyrtolat_prefix_post_title($data, $postarr) {
// Добавляем префикс только для записей типа post
if ($data['post_type'] == 'post' && $data['post_status'] != 'auto-draft') {
$prefix = '[CyrtoLat] ';
// Проверяем, что префикс ещё не добавлен
if (strpos($data['post_title'], $prefix) !== 0) {
$data['post_title'] = $prefix . $data['post_title'];
}
}
return $data;
}
add_filter('wp_insert_post_data', 'cyrtolat_prefix_post_title', 10, 2);
В этом примере к заголовку каждой записи добавляется префикс [CyrtoLat] при сохранении. Это может быть полезно для маркировки контента.
Автоматическая проверка и блокировка публикации через save_post
Если нужно отменить публикацию записи при несоответствии определенным условиям, можно использовать хук save_post и изменить статус записи.
Пример: Запрет публикации, если в контенте нет ключевого слова
function cyrtolat_check_content_before_publish($post_ID, $post, $update) {
// Проверяем только публикации
if ($post->post_status === 'publish') {
$required_keyword = 'CyrtoLat';
if (stripos($post->post_content, $required_keyword) === false) {
// Снимаем публикацию
wp_update_post(array(
'ID' => $post_ID,
'post_status' => 'draft'
));
// Добавляем уведомление в админку
add_filter('redirect_post_location', function($location) {
return add_query_arg('cyrtolat_error', 1, $location);
});
}
}
}
add_action('save_post', 'cyrtolat_check_content_before_publish', 10, 3);
Этот код проверяет наличие слова CyrtoLat в содержимом записи при попытке публикации. Если слово отсутствует, запись переводится в черновик, а в админке можно вывести уведомление.
Изменение вывода контента с помощью фильтра the_content
Фильтр the_content позволяет модифицировать контент записи прямо перед выводом на сайте. Это удобно для добавления рекламных блоков, авторских подписей или других элементов.
Пример: Добавление авторской подписи в конец записи
function cyrtolat_add_author_signature($content) {
if (is_single() && in_the_loop() && is_main_query()) {
$signature = '<p>— Автор статьи, команда CyrtoLat</p>';
$content .= $signature;
}
return $content;
}
add_filter('the_content', 'cyrtolat_add_author_signature');
Дописывая HTML с подписью, мы делаем контент более информативным и персонализированным.
Изменение запроса записей с помощью pre_get_posts
Иногда нужно модифицировать выборку записей, например, исключить определенные категории из главной ленты или изменить порядок вывода.
Пример: Исключение категории из главного запроса
function cyrtolat_exclude_category_from_home($query) {
if ($query->is_home() && $query->is_main_query()) {
// ID категории, которую нужно исключить
$exclude_cat_id = 5;
$query->set('cat', '-' . $exclude_cat_id);
}
}
add_action('pre_get_posts', 'cyrtolat_exclude_category_from_home');
Этот код исключит из главной страницы все записи из категории с ID 5.
Отслеживание смены статуса записи с помощью transition_post_status
Если нужно выполнить действия при смене статуса записи (например, отправить уведомление при публикации), используется хук transition_post_status.
Пример: Отправка уведомления при публикации записи
function cyrtolat_notify_on_publish($new_status, $old_status, $post) {
if ($old_status !== 'publish' && $new_status === 'publish' && $post->post_type === 'post') {
// Отправляем email администратору
wp_mail(get_option('admin_email'), 'Новая публикация', 'Опубликована новая запись: ' . $post->post_title);
}
}
add_action('transition_post_status', 'cyrtolat_notify_on_publish', 10, 3);
Это полезно для контроля состояния контента и оперативного информирования команды.
Полезные плагины для работы с хуками и контролем записей
Хотя хуки легко использовать вручную, для удобства можно воспользоваться плагинами:
- Code Snippets — позволяет безопасно добавлять пользовательский PHP-код без редактирования functions.php.
- Query Monitor — помогает отлаживать запросы и хуки, видеть, какие фильтры и действия сработали.
- Advanced Custom Fields (ACF) — для расширения данных записей и последующего контроля этих данных через хуки.
Использование этих инструментов ускорит разработку и упростит поддержку кода.
Рекомендации по работе с хуками для контроля записей
При работе с хуками важно соблюдать несколько правил:
- Избегайте конфликтов — используйте уникальные префиксы в названиях функций (например, cyrtolat_).
- Оптимизируйте код — не выполняйте тяжелые операции в хуках, чтобы не замедлять сайт.
- Тестируйте изменения — особенно при изменении данных записей перед сохранением.
- Следите за совместимостью — обновляйте код с выходом новых версий WordPress.
Хуки — это фундаментальный элемент гибкой настройки WordPress, позволяющий решать широкий спектр задач по контролю и управлению записями. Освоив их, вы значительно расширите возможности своих проектов.