Как отредактировать данные записи перед её сохранением?

9 дек. 2011 г., 02:41:12
Просмотры: 62.1K
Голосов: 29

У меня есть плагин, и я хотел бы пропустить содержимое записи через некоторые фильтры до того, как она будет сохранена в базу данных. Изучая API плагинов, я нашел два хука, которые могут быть полезны:

save_post
wp_insert_post

Проблема в том, что похоже save_post не требует возврата переменной, и поэтому я не знаю, как отфильтровать контент, а wp_insert_post выглядит документированным.

Я хотел бы сделать что-то вроде этого:

add_action('whatever_hook_name','my_function');

function my_function($post_content){
    return $post_content.' <br> Эта запись была сохранена '.time();
}

Я собираюсь сделать что-то более полезное, чем добавление временной метки, а именно - запустить некоторые регулярные выражения для фильтрации, но это общий тип фильтра/действия, который я пытаюсь добавить.

Обновление

Обратите внимание, что я хочу перехватить данные на пути к сохранению в базу данных - не тогда, когда они отображаются в записи (например: Не путем добавления фильтра к the_content)

1
Комментарии

Примечание: У вас плохой дизайн :-) 1. Каждый раз при сохранении поста эта строка будет добавляться. (Если вы не удалите предыдущую, у вас появится множество "This post was...") 2. Такие данные следует хранить как мета-значение поста :-) Кстати: save_post вызывается после сохранения данных, то есть после их записи в базу данных (не то, что вам нужно).

jave.web jave.web
20 янв. 2017 г. 19:56:29
Все ответы на вопрос 5
6
44

Фильтр wp_insert_post_data может это сделать:

add_filter( 'wp_insert_post_data' , 'filter_post_data' , '99', 2 );

function filter_post_data( $data , $postarr ) {
    // Изменяем заголовок записи
    $data['post_title'] .= '_suffix';
    return $data;
}
9 дек. 2011 г. 16:31:46
Комментарии

направил меня в правильном направлении, спасибо. я думаю, что на самом деле нужно использовать add_action вместо add_filter. также ваши wpse35931_filter_post_data и filter_handler не согласованы...

cwd cwd
9 дек. 2011 г. 16:38:37

Это определенно фильтр. Хотя фильтры и действия основаны на одной функциональности, что допускает некоторое пересечение. Однако если вы используете это как действие, вы не сможете вернуть данные, что лишит весь смысл. Вам нужно ФИЛЬТРОВАТЬ данные и затем возвращать их.

Jake Jake
13 мая 2016 г. 18:52:49

wp_insert_post_data работает, но это слишком мощно для того, что нужно автору вопроса (и, возможно, другим). Более простой вариант в данной ситуации - content_save_pre, как рекомендовал @drzaus.

rinogo rinogo
17 нояб. 2016 г. 18:05:36

Документация разработчика для фильтра wp_insert_post_data: https://developer.wordpress.org/reference/hooks/wp_insert_post_data/

jave.web jave.web
20 янв. 2017 г. 19:58:33

Вызывается ли этот хук в случаях, когда вы: a) вручную вызываете wp_insert_post() в, например, functions.php вашей темы для вставки/обновления записи ИЛИ b) когда запись сохраняется любым возможным способом (например, через админку, через фронтенд, каким-то другим образом...)?

Vadim H Vadim H
25 июл. 2018 г. 11:27:16

Можно ли изменить второй аргумент $postarr? То есть метаданные записи перед сохранением?

Daniel Jeney Daniel Jeney
9 мар. 2022 г. 16:46:58
Показать остальные 1 комментариев
0
11

Используйте фильтр content_save_pre точно так же, как the_content — разница в том, что он работает при сохранении записи, а не при её отображении.

http://codex.wordpress.org/Plugin_API/Filter_Reference/content_save_pre

11 дек. 2014 г. 23:42:58
2

Вы также можете проверить хук pre_post_update

add_action('pre_post_update', 'before_data_is_saved_function');

function before_data_is_saved_function($post_id) {

}
17 апр. 2018 г. 21:02:58
Комментарии

Работает ли это при создании записи?

Jian Chen Jian Chen
14 мая 2020 г. 05:35:28

Согласно https://developer.wordpress.org/reference/hooks/pre_post_update/, хук pre_post_update вызывается только при обновлении, а не при создании.

betweenbrain betweenbrain
30 янв. 2022 г. 20:26:01
0

Добавьте следующий код в активную тему, чтобы заменить <shell> на [shell] перед сохранением:

 add_filter('content_save_pre', 'my_sanitize_content', 10, 1);
 function my_sanitize_content($value) {
   return str_replace('<shell>', '[shell]', $value);
 }
30 мая 2016 г. 15:01:50
1
-1

Если вы просто хотите добавить что-то похожее в конец всех записей, то я бы предложил использовать фильтр the_content.

function append_to_content( $content ) {
    global $post;
    return $content.'<br />Эта запись была сохранена '.$post->post_date;
}
add_filter( 'the_content', 'append_to_content' );
9 дек. 2011 г. 05:50:16
Комментарии

Спасибо, но я хочу отредактировать данные перед их сохранением в базе данных.

cwd cwd
9 дек. 2011 г. 16:25:44