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 На array of slashed, sanitized, і processed post data.
 * @param array $postarr На array of sanitized (and slashed) але іншіwise unmodified post data.
 * @param array $unsanitized_postarr На array of slashed yet *unsanitized* і unprocessed post data як originally passed to wp_insert_post().
 * @param bool $update Whether this is 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:serversiteswp-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

Нехай ви створили свій кастомні статуси посту .

Ці записи не повинні мати статусу, відмінного від тих, що ми створили. Програмно це легко контролюється, але при редагуванні такого запису з адмінки 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$unsanitized_postarr parameter був added.
З версії 6.0.0$update parameter був added.

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

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

wp-admin/includes/ms-admin-filters.php 29

add_filter( 'wp_insert_post_data', 'avoid_blog_page_permalink_collision', 10, 2);

wp-includes/default-filters.php 92

add_filter( 'wp_insert_post_data', '_wp_customize_changeset_filter_insert_post_data', 10, 2);

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

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