save_post хук-подіяWP 1.5.0

Спрацьовує щоразу, коли запис (пост, сторінка) створюється чи оновлюється, зокрема під час публікації через імпорт, xmlrpc чи e-mail.

Дані записи передаються в другому параметрі $post , але їх ще зазвичай можна отримати через $_POST , $_GET або глобальну змінну global $post_data. Коли та що використовується, залежить від того, як запис редагується. Наприклад, “швидке редагування” (quick edits) використовує $_POST .

Хук спрацьовує наприкінці, після оновлення даних посту, очищення кешу та інших дій.

Хук спрацьовує після того, як було скинуто об’єктний кеш посту. Тому якщо змінюються якісь дані посту на цьому хуку, то кеш посту потрібно скинути ще раз

// Очистимо кеш посту
clean_post_cache( $post_ID );

Або потрібно використовувати хук wp_insert_attachment_data . Тільки ці хуки спрацьовують до скидання кешу, але вони не працюватимуть при виклику функції wp_publish_post() .

З версії 3.7 з’явився такий самий хук save_post_(post_type) . Де замість post_type потрібно вказати назву типу запису і подія спрацьовуватиме лише при збереженні/додаванні запису цього типу. Виглядає хук так:

do_action( "save_post_{$post->post_type}", $post_ID, $post, $update);

save_post – це копія хука wp_insert_post .

Хук edit_post – такий самий як save_post , але спрацьовує тільки при оновленні запису.

Увага! Зациклювання

У хуку save_post потрібно обережно використовувати функцію wp_update_post() .

Використання

add_action( 'save_post', 'wp_kama_save_post_action', 10, 3);

/**
 * Function for `save_post` action-hook.
 *
 * @param int $post_ID Post ID.
 * @param WP_Post $post Post об'єкт.
 * @param bool $update Whether this is existing post being updated.
 *
 * @return void
 */
function wp_kama_save_post_action( $post_ID, $post, $update ){

	// action...
}
$post_ID
(рядок)
ID запису, який оновлюється.
$post
(об’єкт)
Об’єкт запису, який оновлюється. Об’єкт такий самий як зазвичай у глобальній змінній
$post .
$update
(логічний)
true – це оновлення запису.

false — додати новий запис.

Приклади

0

#1 Надсилання 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 = "На вашому сайті наступний запис був оновлений:nn";
	$message.=$post_title. ":". $post_url;

	// Відправляємо листа.
	wp_mail(get_option('admin_email'), $subject, $message);
}
0

#2 Довільний тип запису “book”

Припустимо у вас є тип пост book і вам потрібно додати до нього інформацію про автора, видавця та про друковану копію. Цей код показує, як можна зберегти ці дані в метадані запису:

/**
 * Зберігаємо метадані записи при збереженні посту.
 */
add_action( 'save_post', 'save_book_meta');
function save_book_meta( $post_id ) {
	// Слаг краще вказати один раз і використовувати у всіх кодах
	// пов'язані з типом записи, як і прийнято у класах
	$ slug = 'book';

	// Перевіряємо тип запису, якщо не boo виходимо.
	if ( $slug != $_POST['post_type'] )
		return;

	// Оновлюємо метадані записи.

	if ( isset( $_REQUEST['book_author'] ) ) {
		update_post_meta( $post_id, 'book_author', sanitize_text_field( $_REQUEST['book_author'] ) );
	}

	if ( isset( $_REQUEST['publisher'] ) ) {
		update_post_meta( $post_id, 'publisher', sanitize_text_field( $_REQUEST['publisher'] ) );
	}

	// inprint – це чекбокс.
	if ( isset( $_REQUEST['inprint'] ) ) {
		update_post_meta( $post_id, 'inprint', TRUE );
	} else {
		update_post_meta( $post_id, 'inprint', FALSE );
	}
}

У цьому прикладі, перевірку if ( $slug != $_POST[‘post_type’] ) можна замінити: замість події save_post можна використовувати save_post_book.

0

#3 Як уникнути зациклювання

Якщо ви викликаєте функцію 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 ){
	// Отримаємо реальний 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');

		// оновлюємо запис. В цей час спрацьовує подія save_post
		wp_update_post( array( 'ID' => $post_id, 'post_status' => 'private' ) );

		// Ставимо хук назад
		add_action( 'save_post', 'set_private_categories');
	}
}

Ця частина коду повинна бути обов’язково:

// Видаляємо хук, щоб не було зациклювання
remove_action( 'save_post', 'set_private_categories');

// оновлюємо запис. В цей час спрацьовує подія save_post
wp_update_post( array( 'ID' => $post_id, 'post_status' => 'private' ) );

// Ставимо хук назад
add_action( 'save_post', 'set_private_categories');

список змін

З версії 1.5.0Введено.

Де викликається хук

Де використовується хук у WordPress

wp-includes/default-filters.php 527

add_action( 'save_post', 'delete_get_calendar_cache');

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *