De ce se declanșează acțiunea save_post la crearea unui post nou?

8 iun. 2011, 21:31:22
Vizualizări: 15.5K
Voturi: 38

Sunt surprins de faptul că funcția mea atașată la acțiunea save_post se declanșează când dau click pe link-ul "Postare nouă" în Panoul de Administrare. Notă - acest lucru se întâmplă înainte să apăs butoanele Salvare sau Actualizare, și se declanșează imediat, nu după un timp sau o actualizare automată.

Pe de altă parte, când introduc ceva în postare și apăs butoanele Publicare, Actualizare sau Salvare ciornă, instrucțiunea echo pe care am pus-o în handler-ul de acțiune nu se mai afișează, ceea ce sugerează că acțiunea NU se mai declanșează în alte momente. Acest lucru poate fi necorespunzător.

Iată codul meu:

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

Acest "DA" se afișează (în partea de sus a paginii) când apăs pe link-ul "Postare nouă", dar NU se afișează când introduc ceva și apoi apăs Actualizare, Publicare sau Salvare ciornă. Acest comportament pare să contrazică documentația despre acțiunea save_post și funcția wp_insert_post().

Poate cineva să clarifice această situație?

1
Comentarii

Super!!! Mă confrunt cu aceeași situație când salvez câmpuri personalizate în metabox. Ai vreo idee ce aș putea folosi??

Prasath Nadarajah Prasath Nadarajah
9 iun. 2012 14:45:45
Toate răspunsurile la întrebare 1
5
46

Când dai clic pe 'Postare nouă', încărci pur și simplu pagina wp-admin/post-new.php.

Prin aceasta, WordPress va crea întotdeauna o postare nouă (un 'Schiță automată') pentru a asigura că toate celelalte funcționalități (cum ar fi încărcarea fișierelor media) și plugin-urile funcționează normal, chiar înainte ca tu să salvezi efectiv o schiță sau să publici postarea.

Și asta, la rândul său, declanșează save_post. De aici vine și mesajul tău afișat.

Bine, dar de ce nu primesc un mesaj afișat când actualizez sau public?

Între salvarea și încărcarea următoarei pagini, WordPress trimite de fapt o redirecționare GET înapoi către aceeași pagină, care apare transparent (poți observa acest lucru cu un monitor HTTP, precum HttpFox).

Cu alte cuvinte;

  1. Dai clic pe Actualizează sau Publică
  2. Browser-ul trimite datele către server
  3. WordPress le procesează, iar în acest proces declanșează save_post
  4. WordPress trimite înapoi un header de redirecționare și iese, înainte ca orice output să apară în browser (inclusiv mesajul tău afișat)*
  5. Browser-ul urmează redirecționarea și încarcă pagina 'editare postare'.

Redirecționarea poate părea inutilă (deoarece ai putea pur și simplu să faci un POST către aceeași pagină), dar face parte dintr-o tehnică cunoscută sub numele de Post/Redirect/Get pentru a evita trimiteri duplicate de formulare.

Dacă încerci să afișezi mesaje personalizate bazate pe rezultatul unei funcții atașate la save_post, verifică aceste întrebări/răspunsuri.

*Nu este strict adevărat, mesajul tău afișat va apărea de fapt înainte ca header-ul de redirecționare să fie trimis, dar browser-ul fie îl va ignora, fie lucrurile se întâmplă atât de repede încât nu se afișează niciodată.

8 iun. 2011 21:58:38
Comentarii

Remarcabil. Mulțumesc pentru un răspuns atât de complet și detaliat! În interesul de a învăța mai multe, cum ai dat peste aceste cunoștințe inițial?

Tom Auger Tom Auger
8 iun. 2011 23:14:39

Prin aceeași frustrare pe care o experimentai și tu ;) Procurează-ți un IDE bun (eu folosesc phpDesigner) și explorează fișierele de administrare relevante.

TheDeadMedic TheDeadMedic
8 iun. 2011 23:31:59

Corect, frate. Mulțumesc că ai fost acolo cu expertiza ta!

Tom Auger Tom Auger
9 iun. 2011 18:20:07

O informație excelentă. Începeam să înnebunesc pentru că pe serverul meu local părea să funcționeze "ok", dar nu și pe serverul de producție... se pare că pe serverul local nu aplica corect tehnica post/redirect/get deoarece nu trimitea header-ul de redirectare (nu știu de ce totuși).

The WebMacheter The WebMacheter
15 dec. 2011 08:20:46

Mulțumesc pentru răspuns, speram să folosesc parametrul $update pentru a determina dacă evenimentul de salvare a fost primul sau un eveniment de actualizare, dar am aflat că toate evenimentele manuale de salvare vor avea $update setat ca true. Este așa? Mă întreb dacă există o soluție elegantă fără a compara stările postării care ar putea fi dinamice. (Până acum acesta este răspunsul meu preferat: https://wordpress.stackexchange.com/a/365727/2798)

atwellpub atwellpub
5 feb. 2021 20:36:40