Jak mogę edytować dane posta, zanim zostaną zapisane?

19

Mam wtyczkę i chciałbym móc uruchomić treść postu przez niektóre filtry, zanim zostanie ona zapisana w bazie danych. Patrząc na interfejs wtyczki , widzę, że dwa haki, które wyglądają, jakby mogły być pomocne:

save_post
wp_insert_post

Jedynym problemem jest to, że wygląda na to, że save_postnie wymaga zwracania zmiennej, więc nie wiem, jak filtrować zawartość, i wp_insert_postwygląda na udokumentowany.

Chciałbym zrobić coś takiego:

add_action('whatever_hook_name','my_function');

function my_function($post_content){
    return $post_content.' <br> This post was saved on '.time();
}

Zamierzam zrobić coś bardziej użytecznego niż dodać znacznik czasu, a mianowicie uruchomić kilka filtrów wyrażeń regularnych, ale to jest ogólny typ filtra / akcji, którą próbuję dodać.

Aktualizacja

Pamiętaj, że chcę przechwycić dane na drodze do ich zapisania w bazie danych - nie wtedy, gdy są wyświetlane w poście (np .: Nie poprzez dodanie filtra do the_content)

cwd
źródło
Uwaga: masz zły projekt :-) 1. za każdym razem, gdy zapisywany byłby post, ciąg ten byłby dodawany. (jeśli nie usuniesz poprzedniego, otrzymujesz dużo „2 This post was...” danych, takich jak ten, należy zapisać jako meta wartość postu :-) BTW: save_postjest wywoływane po zapisaniu danych, a więc po nim został zapisany w bazie danych (nie to, co chcesz).
jave.web

Odpowiedzi:

29

Wp_insert_post_data filtr może to zrobić:

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;
}
Anh Tran
źródło
2
poprowadził mnie w dobrym kierunku, dzięki. myślę, że faktycznie musisz użyć add_actionzamiast add_filter. także twoje wpse35931_filter_post_datai filter_handlersą niezgodne ...
cwd
1
To zdecydowanie filtr. Chociaż filtry i działania oparte są na tej samej funkcjonalności, co pozwala na pewne zwrotnice. Jeśli użyjesz tego jako akcji, nie będziesz w stanie zwrócić danych, które usunęłyby cały punkt. Chcesz odfiltrować dane, a następnie zwrócić je.
Jake
2
wp_insert_post_datadziała, ale jest nieco przytłoczony tym, co OP (i być może inni) chcą osiągnąć. Prostsza opcja w tej sytuacji jest content_save_prezalecana przez @drzaus.
rinogo,
1
wp_insert_post_data
Dokumentacja
Czy ten hak jest wywoływany za każdym razem, gdy a) ręcznie wywołujesz wp_insert_post (), na przykład, w funkcji.php twojego motywu, aby wstawić / zaktualizować post LUB b) za każdym razem, gdy post jest zapisywany w jakikolwiek możliwy sposób (np. Przez backend, przez frontend , jakoś jeszcze ...)?
Vadim H
2

Możesz także sprawdzić hak pre_post_update

add_action('pre_post_update', 'before_data_is_saved_function');

function before_data_is_saved_function($post_id) {

}
użytkownik 28231
źródło
1

Dodaj następujący kod do aktywnego tematu zastąpić <shell>z [shell]przed zapisaniem:

 add_filter('content_save_pre', 'my_sanitize_content', 10, 1);
 function my_sanitize_content($value) {
   return str_replace('<shell>', '[shell]', $value);
 }
Suyash Jain
źródło
0

Jeśli chcesz dodać coś podobnego na końcu wszystkich postów, sugerowałbym użycie the_contentfiltra.

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' );
Joshua Abenazer
źródło
Dzięki, ale tak naprawdę chcę edytować dane, zanim zostaną zapisane w bazie danych.
cwd