В WordPress хук save_post_(post_type)
используется для выполнения действий, когда создается или обновляется запись конкретного типа. Это событие аналогично хуку save_post
, но с более узким фокусом, так как оно срабатывает только для определенного типа записей (например, post
, page
, или любой пользовательский тип записи).
do_action( “save_post_{$post->post_type}”, int $post_id, WP_Post $post, bool $update )
Хук save_post_(post_type)
срабатывает каждый раз, когда запись указанного типа (например, пост или страница) сохраняется или обновляется. В отличие от обычного хука save_post
, который срабатывает для всех типов записей, этот хук динамически подставляет тип записи в название, позволяя более точно контролировать, для какого типа записей должен сработать хук.
Например:
save_post_post
для стандартных записей (posts).save_post_page
для страниц (pages).save_post_product
для произвольного типа записи, такого как товары.
Параметры
- $post_id (int): ID записи, которая сохраняется или обновляется.
- $post (WP_Post): Объект записи, содержащий все данные записи.
- $update (bool): Указывает, является ли это обновлением существующей записи (
true
) или созданием новой записи (false
).
Этот хук также срабатывает при нажатии на опцию «Добавить новый» для произвольного типа записи, так как это создает черновик в базе данных. Также он срабатывает при вызове функции wp_update_post
.
Отправка email при создании или обновлении записи типа «book»
Этот пример показывает, как отправить email уведомление администраторам сайта каждый раз, когда запись типа «book» обновляется.
add_action( 'save_post_book', 'notify_admin_on_book_update', 10, 3 );
function notify_admin_on_book_update( $post_id, $post, $update ) {
// Если это ревизия, не делаем ничего
if ( wp_is_post_revision( $post_id ) ) {
return;
}
// Если статус записи не "опубликовано", не отправляем письмо
if ( 'publish' !== $post->post_status ) {
return;
}
// Создаем сообщение
$post_title = get_the_title( $post_id );
$post_url = get_permalink( $post_id );
$subject = 'Новая книга опубликована';
$message = "На вашем сайте была обновлена книга: $post_title. Ссылка на книгу: $post_url.";
// Отправляем письмо администраторам
wp_mail( get_option('admin_email'), $subject, $message );
}
Обновление мета-данных записи типа «movie»
В этом примере, когда создается или обновляется запись типа «movie», автоматически добавляются или обновляются мета-данные, такие как режиссер и год выпуска.
add_action( 'save_post_movie', 'update_movie_meta', 10, 3 );
function update_movie_meta( $post_id, $post, $update ) {
// Если это ревизия, не делаем ничего
if ( wp_is_post_revision( $post_id ) ) {
return;
}
// Если это обновление, обрабатываем данные
if ( isset( $_POST['director'] ) ) {
update_post_meta( $post_id, '_movie_director', sanitize_text_field( $_POST['director'] ) );
}
if ( isset( $_POST['release_year'] ) ) {
update_post_meta( $post_id, '_movie_release_year', sanitize_text_field( $_POST['release_year'] ) );
}
}
Отправка уведомлений пользователям при добавлении нового поста типа «event»
Этот пример отправляет уведомление пользователям, когда добавляется новая запись типа «event». Уведомление включает название мероприятия и ссылку на страницу.
add_action( 'save_post_event', 'send_event_notification', 10, 3 );
function send_event_notification( $post_id, $post, $update ) {
// Если это обновление, не делаем ничего
if ( $update ) {
return;
}
// Собираем список подписчиков
$subscribers = get_users( array( 'role' => 'subscriber' ) );
$email_addresses = array();
foreach ( $subscribers as $subscriber ) {
$email_addresses[] = $subscriber->user_email;
}
// Отправляем уведомление
$subject = 'Новое событие на сайте!';
$message = sprintf(
'Новый пост о событии "%s" был опубликован. Подробности можно найти по ссылке: %s.',
get_the_title( $post_id ),
get_permalink( $post_id )
);
wp_mail( $email_addresses, $subject, $message );
}
Важные замечания
- Использование для пользовательских типов записей: Хук
save_post_(post_type)
особенно полезен для работы с пользовательскими типами записей (CPT). Например, если у вас есть тип записи «book» или «event», вы можете использовать хукsave_post_book
илиsave_post_event
для специфической обработки этих типов записей. - Избежание зацикливания: Когда вы используете этот хук с функцией
wp_update_post
или другими действиями, которые могут привести к обновлению поста, важно учитывать возможное зацикливание. Вы можете добавить проверки на обновление и избегать ненужных вызовов функций.
Заключение
Хук save_post_(post_type)
является мощным инструментом для обработки действий при создании или обновлении записей в WordPress, особенно для специализированных типов контента.