State scrivendo il vostro plugin WordPress utilizzando l’action save_post e notate che i dati vengono salvati due volte?
Non vi preoccupate, è una cosa normale! Si è normale perché l’action save_post viene richiamato due volte nel seguente modo:
- prima volta per salvare la revisione del post
- seconda volta per salvare il post corrente
N.b.:Naturalmente questo non avviene se avete disabilitato le revisioni del post.
Come procedere quindi per evitare questa collisione di dati? Come possiamo risolvere il problema?
Risoluzione del problema
La risoluzione è molto semplice, quello che possiamo fare è aggiungere un controllo all’interno della funzione richiamata dal save_post, verificando la tipologia del post prima di salvare i dati.
Qui ci vengono in aiuto 2 funzioni di WordPress:
- wp_is_post_revision (lingua: italiano)
- wp_is_post_autosave (lingua: inglese)
A cosa servono queste 2 funzioni?
Il loro nome è autoesplicativo ma per essere chiari ai meno esperti, la prima (wp_is_post_revision) verifica che il post sia una revisione, mentre la seconda (wp_is_post_autosave) verifica che il post sia un autosalvataggio.
Entrambe le funzioni accettano come parametro l’ID del post o l’oggetto post.
Eccome come usarle:
add_action( 'save_post', array ($this->meta_box, 'save' ), 11, 2 ); function save_my_custom_data( $post_id, $post ) { //evita che i dati vengano salvati due volte if ( is_int( wp_is_post_revision( $post ) ) || is_int( wp_is_post_autosave( $post ) ) ) return; //codice da inserire qui update_post_meta( $post_id, 'my_field', $_POST['my_field'] ); }
La riga che si occupa di effettuare il controllo è questa
if ( is_int( wp_is_post_revision( $post ) ) || is_int( wp_is_post_autosave( $post ) ) ) return;
ed in questo modo abbiamo evitato il doppio salvataggio. Secondo voi esiste un modo differente? Commentate per condividere il vostro codice.