Dlaczego akcja save_post jest uruchamiana podczas tworzenia nowego postu?

31

Jestem zaskoczony faktem, że moja funkcja, którą podłączyłem do save_postakcji, uruchamia się po kliknięciu linku „Nowy wpis” w panelu administracyjnym. Uwaga - dzieje się to przed naciśnięciem przycisku Savelub Updatei uruchamia się natychmiast, nie po upływie czasu lub automatycznej aktualizacji.

Z drugiej strony, gdy ja wtedy wpisać w coś, a następnie naciśnij Publishlub Updatelub Save Draftprzycisków, instrukcja echo Mam umieścić w moim obsługi akcji nie odzwierciedlają się, więc wydaje się, że akcja nie jest wypalanie w dowolnym innym momencie. Może to być niezwiązane.

Oto mój kod:

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

To TAK powtarza się (u góry strony), gdy kliknę link „Nowy post”, ale NIE echo, gdy coś wpisuję, a następnie naciskam Updatelub Publishlub Save Draft. Wydaje się to sprzeczne z dokumentacją save_postakcji i wp_insert_post()funkcji.

Czy ktoś może mi to wyjaśnić?

Tom Auger
źródło
Niesamowite!!! pracuję w tej samej sytuacji podczas zapisywania niestandardowych pól metabox. jakiś pomysł, czego mogę użyć?
Prasath Nadarajah

Odpowiedzi:

39

Kiedy klikniesz „Nowy post”, po prostu ładujesz stronę wp-admin/post-new.php.

Czyniąc tak, WordPress zawsze będzie tworzyć nowy post (an „Auto Draft”) w celu zapewnienia, że wszystkie inne funkcje (takie jak przesyłanych mediach) oraz wtyczek pracę jako normalne, nawet przed tobą rzeczywiście zapisać wersję roboczą lub opublikować post.

A to z kolei wyzwala save_post. Stąd twoje echo.

Okej, więc dlaczego nie otrzymuję echa podczas aktualizacji lub publikowania?

Pomiędzy zapisywaniem a ładowaniem następnej strony, WordPress faktycznie wysyła GETprzekierowanie z powrotem do tej samej strony, która wydaje się przezroczysta (możesz to zobaczyć na monitorze HTTP, takim jak HttpFox ).

Innymi słowy;

  1. Klikasz UpdatelubPublish
  2. Przeglądarka wysyła dane do serwera
  3. WordPress sobie z tym poradzi, a proces wyzwala save_post
  4. WordPress odsyła nagłówek przekierowania i kończy działanie, zanim nastąpi jakiekolwiek wyjście przeglądarki (w tym echo) *
  5. Przeglądarka śledzi przekierowanie i ładuje stronę „edytuj wpis”.

Przekierowanie może wydawać się niepotrzebne (ponieważ możesz po prostu POSTprzejść do tej samej strony), ale jest to część techniki znanej jako Post / Redirect / Get w unikaniu powielania formularzy .

Jeśli próbujesz wydrukować niestandardowe wiadomości w oparciu o wynik funkcji, do której się przyczepiłeś save_post, sprawdź te pytania / odpowiedzi .

* Nie do końca prawda, twoje echo faktycznie pojawi się przed wysłaniem nagłówka przekierowania, ale przeglądarka albo go odrzuci, albo rzeczy dzieją się tak szybko, że nigdy się nie renderuje.

TheDeadMedic
źródło
Wybitny. Dzięki za tak kompletną i szczegółową odpowiedź! Aby dowiedzieć się więcej, w jaki sposób trafiłeś na tę wiedzę?
Tom Auger,
Przez tę samą frustrację, której doświadczyłeś;) Zdobądź dobre IDE (używam phpDesigner) i po prostu zagłęb się w odpowiednie pliki administracyjne.
TheDeadMedic
1
Właśnie na brata. Dzięki, że jesteś tam ze swoją wiedzą!
Tom Auger
Niesamowita informacja. Zwariowałem, ponieważ na moim lokalnym serwerze wydawało się, że działa „ok”, ale nie na moim serwerze produkcyjnym ... wygląda na to, że na moim lokalnym serwerze nie stosowałem poprawnie techniki post / redirect / get, ponieważ to nie było wysyłanie nagłówka przekierowania (choć nie wiem dlaczego).
WebMacheter