Perché l'azione save_post si attiva quando creo un nuovo articolo?

8 giu 2011, 21:31:22
Visualizzazioni: 15.5K
Voti: 38

Sono sorpreso dal fatto che la mia funzione collegata all'azione save_post si attivi quando clicco sul link "Nuovo articolo" nel Pannello di Amministrazione di WordPress. Nota - questo avviene prima ancora che io prema Salva o Aggiorna, e si attiva immediatamente, non dopo un tempo trascorso o un auto-aggiornamento.

D'altra parte, quando digito qualcosa e premo i pulsanti Pubblica, Aggiorna o Salva bozza, l'istruzione echo che ho inserito nel gestore dell'azione non viene visualizzata, quindi sembra che l'azione NON si attivi in nessun altro momento. Questo potrebbe non essere correlato.

Ecco il mio codice:

add_action('save_post', 'MyNS\save_event_metabox', 10, 2);
function save_event_metabox($post_id, $post){
  echo "<h1>SI!</h1>";
}

Questo "SI!" viene visualizzato (in cima alla pagina) quando premo il link "Nuovo articolo" ma NON viene visualizzato quando digito qualcosa e poi premo Aggiorna, Pubblica o Salva bozza. Questo sembra contraddire la documentazione sull'azione save_post e sulla funzione wp_insert_post().

Qualcuno può chiarirmi questo comportamento?

1
Commenti

Fantastico!!! Mi trovo nella stessa situazione quando salvo i campi delle metabox personalizzate. Hai qualche idea su cosa posso usare??

Prasath Nadarajah Prasath Nadarajah
9 giu 2012 14:45:45
Tutte le risposte alla domanda 1
5
46

Quando clicchi su 'Nuovo articolo', stai semplicemente caricando la pagina wp-admin/post-new.php.

In questo modo, WordPress creerà sempre un nuovo articolo (una 'Bozza automatica') per garantire che tutte le altre funzionalità (come il caricamento dei media) e i plugin funzionino normalmente, anche prima che tu salvi effettivamente una bozza o pubblichi l'articolo.

E questo, a sua volta, attiva save_post. Da qui il tuo echo.

Ok, quindi perché non ottengo un echo quando aggiorno o pubblico?

Tra il salvataggio e il successivo caricamento della pagina, WordPress sta effettivamente inviando un reindirizzamento GET alla stessa pagina, che appare trasparente (puoi verificarlo con un monitor HTTP, come HttpFox).

In altre parole;

  1. Clicchi su Aggiorna o Pubblica
  2. Il browser invia i dati al server
  3. WordPress li gestisce e nel processo attiva save_post
  4. WordPress invia un'intestazione di reindirizzamento e termina, prima che avvenga qualsiasi output del browser (incluso il tuo echo)*
  5. Il browser segue il reindirizzamento e carica la pagina 'modifica articolo'.

Il reindirizzamento potrebbe sembrare non necessario (dato che potresti semplicemente fare un POST alla stessa pagina), ma fa parte di una tecnica nota come Post/Redirect/Get per evitare invii duplicati del modulo.

Se stai cercando di stampare messaggi personalizzati basati sul risultato di una funzione agganciata a save_post, dai un'occhiata a queste domande/risposte.

*Non è strettamente vero, il tuo echo in realtà avverrà prima che venga inviata l'intestazione di reindirizzamento, ma il browser lo scarterà o le cose accadranno così rapidamente che non verrà mai renderizzato.

8 giu 2011 21:58:38
Commenti

Eccezionale. Grazie per una risposta così completa e dettagliata! Per approfondire, come hai acquisito questa conoscenza inizialmente?

Tom Auger Tom Auger
8 giu 2011 23:14:39

Attraverso la stessa frustrazione che stavi vivendo ;) Procurati un buon IDE (io uso phpDesigner) e immergiti nei file di amministrazione rilevanti.

TheDeadMedic TheDeadMedic
8 giu 2011 23:31:59

Esatto, fratello. Grazie per esserci con la tua esperienza!

Tom Auger Tom Auger
9 giu 2011 18:20:07

Fantastico pezzo di informazione. Stavo impazzendo perché nel mio server locale sembrava funzionare "ok", ma non nel server di produzione... sembra che nel mio server locale non stesse applicando correttamente la tecnica post/redirect/get perché non inviava l'header di redirect (non so perché però).

The WebMacheter The WebMacheter
15 dic 2011 08:20:46

Grazie per la risposta, speravo di sfruttare il parametro $update per determinare se l'evento di salvataggio fosse il primo o un aggiornamento, ma ho appreso che tutti gli eventi di salvataggio manuale avranno $update come true. È così? Mi chiedo se esista una soluzione elegante senza dover confrontare gli stati del post che potrebbero essere dinamici. (Questa finora è la mia risposta preferita: https://wordpress.stackexchange.com/a/365727/2798)

atwellpub atwellpub
5 feb 2021 20:36:40