Как я могу редактировать данные публикации до их сохранения?


У меня есть плагин, и я хотел бы иметь возможность пропускать содержимое публикации через некоторые фильтры, прежде чем оно будет сохранено в базе данных. Посмотрев на 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> This post was saved on '.time();
}

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

Обновление

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

Author: cwd, 2011-12-09

5 answers

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

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

function filter_post_data( $data , $postarr ) {
    // Change post title
    $data['post_title'] .= '_suffix';
    return $data;
}
 35
Author: Anh Tran, 2012-08-24 17:48:45

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

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

 7
Author: drzaus, 2014-12-11 21:42:58

Вы также можете проверить наличие крючка pre_post_update

add_action('pre_post_update', 'before_data_is_saved_function');

function before_data_is_saved_function($post_id) {

}
 3
Author: user28231, 2018-04-17 18:02:58

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

 add_filter('content_save_pre', 'my_sanitize_content', 10, 1);
 function my_sanitize_content($value) {
   return str_replace('<shell>', '[shell]', $value);
 }
 1
Author: Suyash Jain, 2019-03-21 00:49:39

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

function append_to_content( $content ) {
    global $post;
    return $content.'<br />This post was saved on '.$post->post_date;
}
add_filter( 'the_content', 'append_to_content' );
 0
Author: Joshua Abenazer, 2011-12-09 03:50:16