В WordPress часто требуется выполнять дополнительные действия сразу после сохранения записи. Для этого существует несколько хуков, которые позволяют вмешаться в процесс сохранения контента и выполнить собственные операции — например, отправить уведомление, изменить метаданные или интегрироваться с внешними сервисами. В этой статье мы подробно рассмотрим, как использовать хук save_post для дополнительной обработки после сохранения записи в WordPress.
Что такое хук save_post и когда он срабатывает
Хук save_post вызывается каждый раз, когда создаётся или обновляется запись (пост) в WordPress. Это универсальный action, который срабатывает после сохранения данных в базу, но до того, как страница редактирования вернётся пользователю.
Основные параметры хука:
$post_ID— ID сохранённой записи;$post— объект записи с полной информацией;$update— булево значение, указывающее, обновляется ли запись (true) или создаётся новая (false).
Эти параметры позволяют гибко управлять логикой, реагируя по-разному на создание и обновление записей.
Практическое применение хука save_post
Рассмотрим несколько примеров, как можно использовать save_post для решения реальных задач.
1. Автоматическое обновление метаполя после сохранения записи
Допустим, вам нужно автоматически обновлять метаполе _cyrtolat_processed, чтобы отметить, что запись была обработана вашим кодом.
function cyrtolat_save_post_update_meta($post_ID, $post, $update) {
// Проверяем тип записи, чтобы не сработать на всех
if ($post->post_type !== 'post') {
return;
}
// Обновляем метаполе
update_post_meta($post_ID, '_cyrtolat_processed', current_time('mysql'));
}
add_action('save_post', 'cyrtolat_save_post_update_meta', 10, 3);
Этот код будет автоматически записывать время последней обработки в метаполе при каждом сохранении записи типа post.
2. Отправка уведомления при публикации новой записи
Иногда нужно отправлять email администраторам или другим пользователям, когда создаётся новая публикация.
function cyrtolat_notify_on_new_post($post_ID, $post, $update) {
// Действуем только при создании новой записи
if ($update) {
return;
}
if ($post->post_status !== 'publish') {
return;
}
$to = get_option('admin_email');
$subject = 'Новая публикация на сайте';
$message = 'Опубликована новая запись: ' . get_the_title($post_ID) . "\n" . get_permalink($post_ID);
wp_mail($to, $subject, $message);
}
add_action('save_post', 'cyrtolat_notify_on_new_post', 10, 3);
Этот код проверяет, что запись только что была опубликована, и отправляет письмо админу.
Важные нюансы при работе с save_post
При использовании хука save_post важно учитывать некоторые моменты, чтобы избежать ошибок и зацикливания:
- Избегайте бесконечных циклов. Если внутри вашего обработчика вы вызываете функции обновления записи (например,
wp_update_postилиupdate_post_meta), это может повторно вызватьsave_postи привести к бесконечному циклу. Чтобы этого избежать, используйте флаги или remove_action/add_action. - Проверяйте права пользователя. Если ваш код зависит от данных, введённых пользователем, убедитесь, что текущий пользователь имеет необходимые права.
- Обрабатывайте только нужные типы записей. Чтобы не нагружать систему, фильтруйте запись по типу
post_type. - Используйте правильный приоритет и количество аргументов. Для получения всех параметров укажите 3 аргумента и приоритет не выше 10.
Пример обработки с защитой от рекурсии
Приведём пример, который обновляет метаполе, но не вызывает повторное срабатывание хука.
function cyrtolat_save_post_no_recursion($post_ID, $post, $update) {
static $running = false;
if ($running) {
return;
}
if ($post->post_type !== 'post') {
return;
}
$running = true;
update_post_meta($post_ID, '_cyrtolat_flag', 'yes');
$running = false;
}
add_action('save_post', 'cyrtolat_save_post_no_recursion', 10, 3);
Использование статической переменной $running предотвращает повторное выполнение кода внутри одного процесса сохранения.
Интеграция с плагинами WPShop
Если вы используете на сайте плагины из WPShop, например Clearfy Pro или Expert Review, то можете расширить функционал, реагируя на сохранение записей с помощью save_post.
Например, с помощью Clearfy Pro можно автоматически очищать кеш или обновлять SEO-метаданные при изменении записей, вызывая эти функции внутри вашего обработчика.
Заключение по использованию save_post
Хук save_post — это мощный инструмент для расширения функционала WordPress путем выполнения произвольных действий сразу после сохранения записи. Правильное использование этого хука помогает автоматизировать рутинные процессы, интегрировать сайт с внешними сервисами и улучшать пользовательский опыт.
Обязательно учитывайте все особенности и ограничения, чтобы избежать ошибок и конфликтов с другими плагинами и темами.