WordPress как на ладони
Прибыльная монетизация. Выгодно. Безопасно. Стабильно.

wp_insert_post_dataхук-фильтрWP 2.7.0

Фильтрует данные записи, прямо перед тем, как вставить или обновить их в БД через функцию wp_insert_post(). Все данные экранированы слэшами!

На этом этапе данные еще не очищены от экранированных слэшей \, см. wp_unslash().

Этот фильтр удобен, когда перед тем как записать/обновить данные поста их нужно изменить. Например заменить какие-либо строки в контенте, проверить дату, изменить другие поля: post_name, guid...

Использование

add_filter( 'wp_insert_post_data', 'wp_kama_insert_post_data_filter', 10, 4 );

/**
 * Function for `wp_insert_post_data` filter-hook.
 * 
 * @param array $data                An array of slashed, sanitized, and processed post data.
 * @param array $postarr             An array of sanitized (and slashed) but otherwise unmodified post data.
 * @param array $unsanitized_postarr An array of slashed yet *unsanitized* and unprocessed post data as originally passed to wp_insert_post().
 * @param bool  $update              Whether this is an existing post being updated.
 *
 * @return array
 */
function wp_kama_insert_post_data_filter( $data, $postarr, $unsanitized_postarr, $update ){

	// filter...
	return $data;
}
$data(массив)

Данные поста. Данные содержат экранированные слэши \!

Array (
	[post_author] => 1
	[post_date] => 2019-05-27 17:11:32
	[post_date_gmt] => 2019-05-27 13:11:32
	[post_content] =>
	[post_content_filtered] =>
	[post_title] => w3hosK-d_yE
	[post_excerpt] =>
	[post_status] => inherit
	[post_type] => attachment
	[comment_status] => open
	[ping_status] => closed
	[post_password] =>
	[post_name] => w3hosk-d_ye
	[to_ping] =>
	[pinged] =>
	[post_modified] => 2019-05-27 17:11:32
	[post_modified_gmt] => 2019-05-27 13:11:32
	[post_parent] => 0
	[menu_order] => 0
	[post_mime_type] => image/jpeg
	[guid] => http://wp-test.ru/wp-content/uploads/2019/05/w3hosK-d_yE-2.jpg
)
$postarr(массив)

Оригинальные данные поста переданные в wp_insert_post().

Array (
	[post_author] => 1
	[post_content] =>
	[post_content_filtered] =>
	[post_title] => w3hosK-d_yE
	[post_excerpt] =>
	[post_status] => draft
	[post_type] => attachment
	[comment_status] =>
	[ping_status] =>
	[post_password] =>
	[to_ping] =>
	[pinged] =>
	[post_parent] => 0
	[menu_order] => 0
	[guid] => http://wp-test.ru/wp-content/uploads/2019/05/w3hosK-d_yE-2.jpg
	[import_id] => 0
	[context] =>
	[file] => F:\server\sites\wp-test.ru/wp-content/uploads/2019/05/w3hosK-d_yE-2.jpg
	[post_mime_type] => image/jpeg
	[ID] => 0
	[filter] => db
)
$unsanitized_postarr(массив) (WP 5.4.1)
Неочищенные данные поста. Массив данных со слэшами.
$update(true/false) (WP 6.0)
true - когда обновляется уже существующий. false - когда добавляется новый.

Примеры

0

#1 Удалим \r (возврат каретки) из контента записи

## Удаляет \r (возврат каретки) из контента записи
add_action( 'wp_insert_post_data', 'remove_r_carriage_return', 0 );
function remove_r_carriage_return( $data ){
	$data['post_content'] = str_replace( "\r", '', $data['post_content'] );
	return $data;
}
0

#2 Изменим данные записи перед обновлением

Перед тем как фильтровать данные нужно обязательно убедиться что мы изменяем данные нужно типа записи и в нужном контексте.

Этот пример показывает как в поле guid всегда записывать постоянную ссылку на запись:

add_action( 'wp_insert_post_data', 'who_book_save', 20, 2 );
function who_book_save( $data, $postarr ){

	if(
		// убедимся что мы редактируем нужный тип поста
		( empty( $_POST['post_type'] ) || 'book' !== $_POST['post_type'] )
		||
		// пропустим если это автосохранение
		( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
		||
		// убедимся что мы на нужной странице админки
		( 'book' !== get_current_screen()->id )
		||
		// убедимся что пользователь может редактировать запись
		! current_user_can( 'edit_post', $postarr['ID'] )
	)
		return $data;

	// Все ОК
	$data['guid'] = get_permalink( $postarr['ID'] );

	return $data;
}
0

#3 Запретим сохранение записи со статусом publish

Пусть вы создали свой кастомный тип записи transaction и зарегистрировали свои кастомные статусы поста.

Эти записи не должны иметь статус, отличный от тех, что мы создали. Программно это легко контролируется, но при редактировании такой записи из админки WordPress при сохранении автоматически назначит ей статус publish (опубликовано). Код ниже решает проблему:

add_filter( 'wp_insert_post_data', 'restoring_status_saved_admin_panel' );

/**
 * При сохранении из админки восстанавливает оригинальный статус транзакции,
 * так как WordPress пытается назначить ей статус publish.
 *
 * @param array $data
 *
 * @return array
 */
function restoring_status_saved_admin_panel( $data ) {
	if ( 'transaction' === $data['post_type'] && 'publish' === $data['post_status'] ) {
		$data['post_status'] = sanitize_key( filter_input( INPUT_POST, 'original_post_status' ) );
	}

	return $data;
}
0

#4 Как выглядят переменные передаваемые в функцию

В $data по умолчанию передаются следующие поля:

Array
(
	[post_author] => 1
	[post_date] => 2015-07-15 02:44:40
	[post_date_gmt] => 2015-07-14 23:44:40
	[post_content] = контент
	[post_content_filtered] =>
	[post_title] => supermy
	[post_excerpt] =>
	[post_status] => publish
	[post_type] => book
	[comment_status] => closed
	[ping_status] => closed
	[post_password] =>
	[post_name] => supermy__
	[to_ping] =>
	[pinged] =>
	[post_modified] => 2015-07-16 01:10:27
	[post_modified_gmt] => 2015-07-15 22:10:27
	[post_parent] => 0
	[menu_order] => 0
	[post_mime_type] =>
	[guid] => http://example.com/?post_type=book&p=19
)

Поля по умолчанию для параметра $postarr:

'post_status'           - 'draft'.
'post_type'             - 'post'.
'post_author'           - ID текущего пользователя или кто создал запись.
'ping_status'           - значение настройки 'default_ping_status'.
'post_parent'           - 0
'menu_order'            - 0
'to_ping'               -
'pinged'                - пустая строка
'post_password'         - пустая строка
'guid'                  - уникальный ID
'post_content_filtered' -
'post_excerpt'          - текст.

А так выглядит $postarr:

Array
(
	[post_status] => publish
	[post_type] => book
	[post_author] => 1
	[ping_status] => closed
	[post_parent] => 0
	[menu_order] => 0
	[to_ping] =>
	[pinged] =>
	[post_password] =>
	[guid] => http://example.com/?post_type=book&p=19
	[post_content_filtered] =>
	[post_excerpt] =>
	[import_id] => 0
	[post_content] = текст
	[post_title] => supermy
	[context] =>
	[ID] => 19
	[post_date] => 2015-07-15 02:44:40
	[post_date_gmt] => 2015-07-14 23:44:40
	[comment_status] => closed
	[post_name] => supermy__
	[post_modified] => 2015-07-16 00:48:42
	[post_modified_gmt] => 2015-07-15 21:48:42
	[post_mime_type] =>
	[comment_count] => 0
	[ancestors] => Array
		(
		)

	[post_category] => Array
		(
		)

	[tags_input] => Array
		(
		)

	[_wpnonce] => e296535396
	[_wp_http_referer] => /wp-admin/post.php?post=19&action=edit
	[user_ID] => 1
	[action] => editpost
	[originalaction] => editpost
	[original_post_status] => publish
	[referredby] => http://example.com/wp-admin/edit.php?post_type=book
	[_wp_original_http_referer] => http://example.com/wp-admin/edit.php?post_type=book
	[post_ID] => 19
	[meta-box-order-nonce] => ea65cc23d4
	[closedpostboxesnonce] => ca65bc8597
	[samplepermalinknonce] => f19941a639
	[hidden_post_status] => publish
	[hidden_post_password] =>
	[hidden_post_visibility] => public
	[visibility] => public
	[mm] => 07
	[jj] => 15
	[aa] => 2015
	[hh] => 02
	[mn] => 44
	[ss] => 40
	[hidden_mm] => 07
	[cur_mm] => 07
	[hidden_jj] => 15
	[cur_jj] => 16
	[hidden_aa] => 2015
	[cur_aa] => 2015
	[hidden_hh] => 02
	[cur_hh] => 00
	[hidden_mn] => 44
	[cur_mn] => 19
	[original_publish] => Обновить
	[save] => Обновить
	[filter] => db
)

Список изменений

С версии 2.7.0 Введена.
С версии 5.4.1 The $unsanitized_postarr parameter was added.
С версии 6.0.0 The $update parameter was added.

Где вызывается хук

wp_insert_post()
wp_insert_post_data
wp-includes/post.php 4418
$data = apply_filters( 'wp_insert_post_data', $data, $postarr, $unsanitized_postarr, $update );

Где используется хук в WordPress

wp-admin/includes/ms-admin-filters.php 26
add_filter( 'wp_insert_post_data', 'avoid_blog_page_permalink_collision', 10, 2 );
wp-includes/class-wp-customize-manager.php 2950
add_filter( 'wp_insert_post_data', array( $this, 'preserve_insert_changeset_post_content' ), 5, 3 );
wp-includes/class-wp-customize-manager.php 2981
remove_filter( 'wp_insert_post_data', array( $this, 'preserve_insert_changeset_post_content' ), 5 );
wp-includes/default-filters.php 92
add_filter( 'wp_insert_post_data', '_wp_customize_changeset_filter_insert_post_data', 10, 2 );
11 комментариев
Полезные 1 Все
    Войти