Хук save_post
срабатывает каждый раз, когда создается или обновляется запись или страница в WordPress. Это включает обновления, сделанные через импорты, XML-RPC или даже отправки через email. Этот хук является отличной возможностью для выполнения действий или изменения данных записи сразу после их сохранения.
do_action( ‘save_post’, int $post_id, WP_Post $post, bool $update )
Параметры хука save_post
- $post_id (int): ID записи, которая сохраняется.
- $post (WP_Post): Объект записи, содержащий данные записи.
- $update (bool): Указывает, является ли запись обновлением (значение
true
) или новой записью (значениеfalse
).
Основные моменты
Хук save_post
срабатывает после того, как WordPress сохраняет запись, но до того, как она будет окончательно очищена в кэше или выполнены другие дополнительные действия. Это означает, что любые изменения в данных записи, сделанные на этом хуке, потребуют дополнительной очистки кэша.
Для лучшего управления типами записей, начиная с версии 3.7, был введен хук save_post_{post_type}
, который срабатывает только для конкретных типов записей, что позволяет избежать излишних вызовов для всех записей.
Отправка email при обновлении записи
Этот пример показывает, как отправить письмо администратору сайта каждый раз, когда запись обновляется.
add_action( 'save_post', 'my_project_updated_send_email' );
function my_project_updated_send_email( $post_id ) {
// Проверяем, если это ревизия, то не отправляем письмо
if ( wp_is_post_revision( $post_id ) || get_post($post_id)->post_status != 'publish' ) {
return;
}
$post_title = get_the_title( $post_id );
$post_url = get_permalink( $post_id );
$subject = 'Запись была обновлена';
$message = "На вашем сайте была обновлена следующая запись:\n\n";
$message .= $post_title . ": " . $post_url;
// Отправляем письмо.
wp_mail( get_option('admin_email'), $subject, $message );
}
Сохранение метаданных для произвольного типа записи
Допустим, у вас есть произвольный тип записи, например, «book», и вам нужно сохранить информацию об авторе и издателе. Этот код покажет, как сохранять эти данные в метаданных записи.
add_action( 'save_post', 'save_book_meta' );
function save_book_meta( $post_id ) {
// Проверяем, что это запись типа 'book'
if ( 'book' !== get_post_type( $post_id ) ) {
return;
}
// Обновляем метаданные
if ( isset( $_POST['book_author'] ) ) {
update_post_meta( $post_id, 'book_author', sanitize_text_field( $_POST['book_author'] ) );
}
if ( isset( $_POST['publisher'] ) ) {
update_post_meta( $post_id, 'publisher', sanitize_text_field( $_POST['publisher'] ) );
}
}
Как избежать зацикливания при использовании wp_update_post
Если вы вызываете функцию wp_update_post
внутри хука save_post
, это может привести к бесконечному циклу, так как wp_update_post
снова вызывает хук save_post
. Чтобы избежать этого, необходимо временно удалить хук перед вызовом wp_update_post
, а затем снова его добавить:
add_action( 'save_post', 'set_private_categories' );
function set_private_categories( $post_id ) {
// Проверяем, является ли это ревизией
if ( $parent_id = wp_is_post_revision( $post_id ) ) {
$post_id = $parent_id;
}
// Получаем ID категории по умолчанию
$defaultcat = get_option( 'default_category' );
// Проверяем, если запись уже в категории по умолчанию
if ( in_category( $defaultcat, $post_id ) ) {
// Удаляем хук, чтобы избежать зацикливания
remove_action( 'save_post', 'set_private_categories' );
// Обновляем статус записи
wp_update_post( array( 'ID' => $post_id, 'post_status' => 'private' ) );
// Восстанавливаем хук
add_action( 'save_post', 'set_private_categories' );
}
}
Важные замечания:
- Избегайте зацикливания: Будьте осторожны при использовании функции
wp_update_post
внутри хукаsave_post
, так как она может привести к бесконечному циклу. Используйте метод удаления и восстановления хука для предотвращения этой проблемы. - Использование хуков для определенных типов записей: С версии 3.7 рекомендуется использовать хук
save_post_{post_type}
для конкретных типов записей, чтобы избежать лишней нагрузки и улучшить производительность.
Заключение
Хук save_post
— мощный инструмент для работы с постами и страницами в WordPress, дающий вам возможность изменять или добавлять данные в момент их сохранения.