WordPress как на ладони
wordpress jino

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

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

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

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

add_filter( 'wp_insert_post_data', 'filter_function_name_11', 10, 2 );
function filter_function_name_11( $data, $postarr ) {
	// фильтруем $data ...

	return $data;
}
$data(массив)
Очищенные данные поста.
$postarr(массив)
Оригинальные данные поста переданные в $_POST

Примеры

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

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

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

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

	// Все ОК! обрабатываем
	$data['guid'] = get_permalink( $postarr['ID'] );

	return $data;
}

Заметки

В $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://site.ru/?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://site.ru/?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://site.ru/wp-admin/edit.php?post_type=book
	[_wp_original_http_referer] => http://site.ru/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
)

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

wp_insert_post() остальные хуки:

Код хука-фильтра wp_insert_post_data

Фрагмент из: wp-includes/post.php VER 4.9.4
...
		 * @since 3.9.0
		 *
		 * @param array $data    An array of sanitized attachment post data.
		 * @param array $postarr An array of unsanitized attachment post data.
		 */
		$data = apply_filters( 'wp_insert_attachment_data', $data, $postarr );
	} else {
		/**
		 * Filters slashed post data just before it is inserted into the database.
		 *
		 * @since 2.7.0
		 *
		 * @param array $data    An array of slashed post data.
		 * @param array $postarr An array of sanitized, but otherwise unmodified post data.
		 */
		$data = apply_filters( 'wp_insert_post_data', $data, $postarr );
	}
	$data = wp_unslash( $data );
	$where = array( 'ID' => $post_ID );

	if ( $update ) {
		/**
		 * Fires immediately before an existing post is updated in the database.
		 *
		 * @since 2.5.0
		 *
		 * @param int   $post_ID Post ID.
		 * @param array $data    Array of unslashed post data.
		 */
		do_action( 'pre_post_update', $post_ID, $data );
		if ( false === $wpdb->update( $wpdb->posts, $data, $where ) ) {
...
wp_insert_post_data 1 коммент
  • Иван

    Большое спасибо за статью! Теперь я знаю, как сделать автоматически генерируемые тайтлы из кастомных полей. Не подскажете, как еще автоматически генерировать слаг? Дело в том,что, если не передать заголовок, то wp в слаг ставит id поста, и это совсем не то, чего бы мне хотелось. А эта функция работает на wp_insert_post_data, соответственно, срабатывает каждый раз, когда пост обновляется, что не нужно. Я понимаю, что надо хукать создание поста, но вот как это записать?

Здравствуйте, !

Ваш комментарий
Предпросмотр