wp_insert_post_data
Фільтрує дані запису, перед тим, як вставити або оновити їх у БД через функцію 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 – коли додається новий.
Приклади
#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; }
#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; }
#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; }
#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
add_filter( 'wp_insert_post_data', 'avoid_blog_page_permalink_collision', 10, 2);
add_filter( 'wp_insert_post_data', '_wp_customize_changeset_filter_insert_post_data', 10, 2);