Как отредактировать данные записи перед её сохранением?
У меня есть плагин, и я хотел бы пропустить содержимое записи через некоторые фильтры до того, как она будет сохранена в базу данных. Изучая 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)
Фильтр 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;
}
направил меня в правильном направлении, спасибо. я думаю, что на самом деле нужно использовать add_action вместо add_filter. также ваши wpse35931_filter_post_data и filter_handler не согласованы...
cwd
Это определенно фильтр. Хотя фильтры и действия основаны на одной функциональности, что допускает некоторое пересечение. Однако если вы используете это как действие, вы не сможете вернуть данные, что лишит весь смысл. Вам нужно ФИЛЬТРОВАТЬ данные и затем возвращать их.
Jake
wp_insert_post_data работает, но это слишком мощно для того, что нужно автору вопроса (и, возможно, другим). Более простой вариант в данной ситуации - content_save_pre, как рекомендовал @drzaus.
rinogo
Документация разработчика для фильтра wp_insert_post_data: https://developer.wordpress.org/reference/hooks/wp_insert_post_data/
jave.web
Вызывается ли этот хук в случаях, когда вы: a) вручную вызываете wp_insert_post() в, например, functions.php вашей темы для вставки/обновления записи ИЛИ b) когда запись сохраняется любым возможным способом (например, через админку, через фронтенд, каким-то другим образом...)?
Vadim H
Используйте фильтр content_save_pre точно так же, как the_content — разница в том, что он работает при сохранении записи, а не при её отображении.
http://codex.wordpress.org/Plugin_API/Filter_Reference/content_save_pre
Согласно https://developer.wordpress.org/reference/hooks/pre_post_update/, хук pre_post_update вызывается только при обновлении, а не при создании.
betweenbrain
Если вы просто хотите добавить что-то похожее в конец всех записей, то я бы предложил использовать фильтр the_content.
function append_to_content( $content ) {
global $post;
return $content.'<br />Эта запись была сохранена '.$post->post_date;
}
add_filter( 'the_content', 'append_to_content' );