Eseguire un'azione dopo che un post è stato salvato con tutti i relativi record post_meta (dati)

22 giu 2015, 15:26:15
Visualizzazioni: 29K
Voti: 6

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!

2
Commenti

I metadati del post vengono salvati nella stessa funzione?

Manny Fleurmond Manny Fleurmond
22 giu 2015 15:54:38

Mm, non sono sicuro della tua domanda... Per favore controlla la parte aggiornata della mia domanda, la sezione del file function.php

user198003 user198003
22 giu 2015 16:11:43
Tutte le risposte alla domanda 4
5

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!

23 giu 2015 01:12:22
Commenti

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

user198003 user198003
23 giu 2015 10:39:51

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'?

Frank P. Walentynowicz Frank P. Walentynowicz
23 giu 2015 16:37:38

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

Frank P. Walentynowicz Frank P. Walentynowicz
23 giu 2015 17:37:25

Funziona anche con i prodotti WooCommerce?

Amjad Amjad
19 mar 2019 03:07:29

Un prodotto WooCommerce è un custom post type. La soluzione sopra indicata funziona con qualsiasi tipo di post.

Frank P. Walentynowicz Frank P. Walentynowicz
19 mar 2019 05:09:10
0

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);
21 gen 2016 20:56:27
0

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/

28 mag 2020 12:59:50
0

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 ); 
   //  ...
}
9 feb 2022 17:39:42