Aggiungere un valore meta al contenuto del post in WordPress durante save_post
Il problema sembra abbastanza semplice: Quando viene attivata l'azione save_post, vorrei aggiungere il valore di una meta chiave alla fine del post_content se non è già presente nel post stesso.
Ho provato a chiamare wp_update_post() all'interno di una funzione collegata a save_post, ma come molti di voi obietteranno immediatamente, wp_update_post() contiene do_action('save_post') e quindi crea un loop infinito.
Quale altro modo (utilizzando l'API) esiste per aggiornare il contenuto di un post basandosi sui suoi valori personalizzati una volta che il post è stato salvato/modificato senza invocare un incubo di loop infinito?
La soluzione iniziale che ho trovato è quella di collegare un filtro a un'azione come wp_insert_post_data ed estrarre altre informazioni del post dall'oggetto globale $post.
// Aggiungiamo il nostro filtro all'azione wp_insert_post_data
add_filter( 'wp_insert_post_data', 'my_appender' );
function my_appender( $content ) {
// Portiamo l'oggetto globale $post nello scope
global $post;
// Otteniamo il valore del meta campo 'key_name'
$meta_value = get_post_meta( $post->ID, 'key_name', TRUE );
// Se il valore non è presente nel contenuto, lo aggiungiamo alla fine
if ( stristr( $content['post_content'], $meta_value ) === FALSE )
$content['post_content'] .= $meta_value;
// Restituiamo il contenuto filtrato
return $content;
}
Sono certo che questa soluzione possa essere migliorata.
Riferimenti
add_filter()- "I filtri sono gli hook che WordPress lancia..."wp_insert_post_data- "Un hook filter chiamato dalla funzione wp_insert_post..."globalkeyword - "Lo scope di una variabile è il contesto in cui è definita..."get_post_meta()- "Questa funzione restituisce i valori dei campi personalizzati..."stristr()- "Trova la prima occorrenza di una stringa (senza distinzione tra maiuscole e minuscole)..."
Sembra ragionevole per me. Immagino che come implementi il controllo dipenda da quale sia esattamente quel valore di post meta.
BoltClock