Eseguire un'azione dopo che un post è stato salvato con tutti i relativi record post_meta (dati)
Devo eseguire codice PHP personalizzato dopo che un nuovo post è stato salvato con tutti i suoi meta dati.
La mia domanda è come realizzarlo? Ho provato con l'azione save_post, ma questa viene eseguita prima che i meta record vengano salvati, quindi non posso usarla in questo caso.
Quindi, come posso eseguire la mia funzione personalizzata dopo che il post con tutti i dati correlati è stato salvato nel database?
AGGIORNAMENTO: Ho provato a realizzarlo con il seguente codice nel file functions.php:
add_action( 'save_post', 'wpse41912_save_post' );
function wpse41912_save_post() {
// ottieni informazioni sull'ultimo post aggiunto
$args = array( 'numberposts' => '1', 'post_type' => 'post' );
$recent_posts = wp_get_recent_posts( $args );
$myFunc_latest_id = $recent_posts[0]['ID']; // id dell'ultimo post
$myFunc_post_details = get_post($myFunc_latest_id);
print_r($myFunc_post_details);
// come eseguire il codice php quando tutti i post meta sono stati aggiunti?
}
Grazie in anticipo!

Per il tipo di post NUOVO 'post' utilizza l'hook di azione draft_to_publish
:
function fpw_post_info( $post ) {
if ( 'post' == $post->post_type ) {
// echo '<pre>'; print_r( $post ); echo '<br />';
// $meta = get_post_meta( $post->ID ); print_r( $meta ); echo '</pre>'; die();
// il tuo codice personalizzato va qui...
}
}
add_action( 'draft_to_publish', 'fpw_post_info', 10, 1 );
Nella tua funzione di callback $post
è il tuo post come oggetto WP_post
. Puoi ottenere i meta del post chiamando la funzione get_post_meta
.
Per il tipo di post NUOVO o AGGIORNATO 'post' utilizza l'hook di azione publish_post
:
function fpw_post_info( $id, $post ) {
// echo '<pre>'; print_r( $post ); echo '<br />';
// $meta = get_post_meta( $post->ID ); print_r( $meta ); echo '</pre>'; die();
// il tuo codice personalizzato va qui...
}
add_action( 'publish_post', 'fpw_post_info', 10, 2 );
In questo caso la funzione di callback accetta due parametri!

Grazie, ma non succede nulla utilizzando l'hook publish_post... Ho anche provato a usare l'hook added_post_meta ma viene eseguito dopo ogni meta aggiunto al post - ho bisogno di quello che viene eseguito dopo l'ultimo meta aggiunto

Cosa intendi con "non succede nulla"? Hai usato il codice sopra senza prima rimuovere i commenti dalle prime due righe? Mostrami il tuo codice? Lo stai usando per un custom post type o solo per 'post'?

Leggi la risposta aggiornata per l'uso corretto dell'hook publish_post
.

Soluzione piuttosto stupida, ma funziona:
function afterPostUpdated($meta_id, $post_id, $meta_key='', $meta_value=''){
if($meta_key=='_edit_lock') {
if($_GET['message']==1) {
//
Il tuo codice qui
//
}
}
}
add_action('updated_post_meta', 'afterPostUpdated', 10, 4);

Potresti usare questo:
function myFunction($post_id, $post, $update ) {
// il tuo codice qui
}
add_action('save_post', 'myFunction');
$update
è un booleano e restituisce false se si tratta di un nuovo post. Se è un aggiornamento restituisce true.
Ecco la documentazione: https://developer.wordpress.org/reference/hooks/save_post/

La risposta corretta e più semplice è utilizzare l'azione wp_insert_post
.
https://developer.wordpress.org/reference/hooks/wp_insert_post/
Un'importante distinzione dell'azione wp_insert_post è che viene attivata dopo che update_post_meta è stato chiamato.
Sono disponibili 3 parametri - il flag $update ti dice se si tratta di un nuovo post o di un aggiornamento.
add_action('wp_insert_post', 'run_after_post_updated', 10, 3);
function run_after_post_updated($post_ID, $post = null, $update = true) {
//nonostante la documentazione indichi 3 parametri, a volte viene passato solo l'ID del post - quindi servono valori predefiniti per gli altri 2 parametri
$meta = get_post_meta( $post_ID );
// ...
}
