Come posso modificare i dati dei post prima che vengano salvati?


19

Ho un plugin e vorrei essere in grado di eseguire il contenuto del post attraverso alcuni filtri prima che venga salvato nel database. Osservando l' API del plug-in , vedo che due hook che sembrano essere utili:

save_post
wp_insert_post

L'unico problema è che sembra che save_postnon sia necessario restituire una variabile, quindi non so come filtrare il contenuto e wp_insert_postsembra documentato.

Mi piacerebbe fare qualcosa del genere:

add_action('whatever_hook_name','my_function');

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

Farò qualcosa di più utile che aggiungere un timestamp, vale a dire eseguire alcuni filtri regex, ma questo è il tipo generale di filtro / azione che sto cercando di aggiungere.

Aggiornare

Si prega di notare che voglio intercettare i dati sul suo modo di essere salvati nel database - non quando vengono visualizzati nel post (ad esempio: non aggiungendo un filtro a the_content)


Nota: hai un cattivo design :-) 1. ogni volta che un post viene salvato, questa stringa viene aggiunta. (se non si elimina quella precedente, si ottiene un sacco di di " This post was..."S 2. I dati come questo dovrebbe essere memorizzato come un valore meta del post :-) BTW: save_postè chiamato dopo i dati sono stati salvati, quindi, dopo che è stato salvato nel database (non quello che vuoi).
jave.web,

Risposte:


29

Il filtro wp_insert_post_data può farlo:

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
mi ha fatto andare nella giusta direzione, grazie. penso che in realtà devi usare add_actionperò invece di add_filter. anche i tuoi wpse35931_filter_post_datae filter_handlersono incongruenti ...
Cwd,

1
È sicuramente un filtro. Sebbene i filtri e le azioni siano basati sulla stessa funzionalità che consente un certo crossover. Se lo usi come azione, tuttavia, non sarai in grado di restituire i dati che rimuoveranno l'intero punto. Si desidera FILTRARE i dati e quindi restituirli.
Jake,

2
wp_insert_post_datafunziona, ma è un po 'sopraffatto per ciò che OP (e forse altri) vogliono realizzare. Un'opzione più semplice in questa situazione è content_save_prequella raccomandata da @drzaus.
Rinogo,

1
Documenti dello sviluppatore per il wp_insert_post_datafiltro: developer.wordpress.org/reference/hooks/wp_insert_post_data
jave.web

Questo hook viene chiamato ogni volta che a) chiama manualmente wp_insert_post () in, ad esempio, Functions.php del tuo tema per inserire / aggiornare un post OPPURE b) ogni volta che un post viene salvato con qualsiasi mezzo possibile (es. Tramite backend, attraverso frontend , in qualche altro modo ...)?
Vadim H,


2

Puoi anche controllare il gancio pre_post_update

add_action('pre_post_update', 'before_data_is_saved_function');

function before_data_is_saved_function($post_id) {

}

1

Aggiungere il seguente codice al tema attivo per sostituire <shell>con [shell]prima di salvare:

 add_filter('content_save_pre', 'my_sanitize_content', 10, 1);
 function my_sanitize_content($value) {
   return str_replace('<shell>', '[shell]', $value);
 }

0

Se vuoi solo aggiungere qualcosa di simile alla fine di tutti i post, ti suggerirei di utilizzare il the_contentfiltro.

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' );

Grazie, ma in realtà voglio modificare i dati prima che vengano salvati nel database.
Cwd
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.