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

19

У меня есть плагин, и я хотел бы иметь возможность выполнять публикацию содержимого через некоторые фильтры, прежде чем он будет сохранен в базе данных. Глядя на 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)

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

Ответы:

29

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;
}
Ань Чан
источник
2
заставил меня идти в правильном направлении, спасибо. Я думаю, что вы на самом деле должны использовать, add_actionхотя вместо add_filter. также ваши wpse35931_filter_post_dataи filter_handlerнесовместимы ...
cwd
1
Это определенно фильтр. Хотя фильтры и действия основаны на одной и той же функциональности, которая допускает некоторое пересечение. Однако, если вы используете это как действие, вы не сможете вернуть данные, которые могли бы удалить весь смысл. Вы хотите отфильтровать данные и затем вернуть их.
Джейк
2
wp_insert_post_dataработает, но немного подавлен для того, что OP (и, возможно, другие) хотят достичь. Более простой вариант в этой ситуации content_save_preсоответствует рекомендациям @drzaus.
Риного
1
Документы для разработчиков для wp_insert_post_dataфильтра: developer.wordpress.org/reference/hooks/wp_insert_post_data
jave.web
Этот хук вызывается всякий раз, когда вы а) вручную вызываете wp_insert_post (), например, в functions.php вашей темы для вставки / обновления поста ИЛИ b) всякий раз, когда пост сохраняется любым возможным способом (например, через бэкэнд, через веб-интерфейс) как-нибудь еще ...)?
Вадим Х
2

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

add_action('pre_post_update', 'before_data_is_saved_function');

function before_data_is_saved_function($post_id) {

}
user28231
источник
1

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

 add_filter('content_save_pre', 'my_sanitize_content', 10, 1);
 function my_sanitize_content($value) {
   return str_replace('<shell>', '[shell]', $value);
 }
Суяш Джайн
источник
0

Если вы просто хотите добавить что-то похожее в конце всех постов, я бы посоветовал вам использовать 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' );
Джошуа Абеназер
источник
Спасибо, но я действительно хочу отредактировать данные, прежде чем они будут сохранены в базе данных.
cwd