jaki jest prawidłowy sposób zaczepienia się przy aktualizacji posta

19

próbuję przechwycić, gdy post jest aktualizowany, ale wszystkie zaczepy próbuję nigdy nie wykonać, z wyjątkiem updated_post_meta

add_action('updated_post_meta', 'my_function');

function my_function($post_id) {    
    echo 'This is my post ID : '.$post_id;
}

Próbowałem tego, add_action('save_post', 'my_function');ale żaden identyfikator nie został wyrenderowany, a może ta wiadomość już się echa, ale nigdy nie wyświetla się z powodu wysłania nagłówka przekierowania.

szorstki
źródło
2
masz po nim spację save_post, czy to jest literówka, czy też w twoim oryginalnym kodzie? także włączyć debugowanie przy opracowywaniu.
Milo
@Milo przepraszam literówka, ale nie w oryginalnym kodzie
rusly
jeśli tak jest, to podczas tworzenia nowego postu powinieneś zobaczyć wynik w lewym górnym rogu ekranu. zapisanie istniejącego postu następuje przed przekierowaniem, więc nic nie zobaczysz, chyba że masz włączone debugowanie.
Milo

Odpowiedzi:

55

Gdy post jest aktualizowany, uruchamiane są pewne haki:

  • 'pre_post_update'to akcja uruchamiana tuż przed aktualizacją posta, przekazany argument to 2: $post_IDi $datajest to tablica wszystkich innych kolumn bazy danych tabeli postów
  • 'transition_post_status'jest hakiem uruchamianym podczas aktualizacji i przekazuje 3 argumenty: $ new_post_status $old_post_statusi $post(obiekt).
  • Następnie wystrzeliwane są 2 inne zaczepy przejściowe, ale mają one dynamiczną nazwę, co oznacza, że ​​uruchomiona efektywna czynność zależy od starego i nowego statusu wpisu. "{$old_status}_to_{$new_status}"a "{$new_status}_{$post->post_type}". Najpierw przekaż jako argument jedyny obiekt post, drugi przekaż identyfikator post i obiekt post. Znajdź dokumentację tutaj .
  • 'edit_post'które przekazują 2 argumenty: $post_IDi $post(obiekt)
  • 'post_updated'które przechodzą 3 argumenty $post_ID, $post_after(po przedmiot po aktualizacji), $post_before(po przedmiot przed aktualizacją)
  • Innym hak dynamiczna: "save_post_{$post->post_type}"to zależy od postu typu, na przykład dla standardowych stanowisk jest 'save_post_post'i dla stron jest 'save_post_page', Hak ten Pass 3 argumenty $post_ID, $post(object) i $updatejest to wartość logiczna (prawda czy fałsz), która jest prawdziwa, kiedy wykonać aktualizację, w fakt, że ten hak jest uruchamiany również wtedy, gdy post jest zapisywany po raz pierwszy.
  • ' save_post' jest uruchamiany zarówno podczas aktualizacji, jak i przy pierwszym zapisywaniu, i przekazuje te same 3 argumenty z poprzedniego przechwytywania.
  • ' save_post_{$post_type}' jest uruchamiany zarówno podczas aktualizacji, jak i przy pierwszym zapisywaniu, i przekazuje te same pierwsze 2 argumenty poprzedniego zaczepu.
  • Wreszcie masz ' wp_insert_post' , który jest uruchamiany zarówno przy aktualizacji, jak i przy pierwszym zapisywaniu, i przekazujesz te same 3 argumenty z poprzednich 2 przechwyceń.

Te haki są uruchamiane za każdym razem, gdy post jest aktualizowany, zarówno przez strony administracyjne w backend, jak i po aktualizacji „ręcznie” za pomocą wp_update_postlub wp_insert_postfunkcji.

Gdy post jest aktualizowany za pomocą stron administracyjnych, uruchamiane są dodatkowe haki, przykładem jest 'update_post_redirect'lub 'post_updated_messages'. (Patrz to i to WPSE odpowiedzi na przykłady stosowania).

Zauważ, że jeśli chcesz skorzystać z argumentu hooks, nie jest to pierwszy, musisz jawnie zadeklarować go w add_actionwywołaniu.

Np. Jeśli chcesz użyć '$update'argumentu (to jest 3) 'save_post'zaczepu, musisz dodać 3jako $accepted_argsparametr add_action( patrz dokumenty ):

// if you don't add 3 as as 4th argument, this will not work as expected
add_action( 'save_post', 'my_save_post_function', 10, 3 );

function my_save_post_function( $post_ID, $post, $update ) {
  $msg = 'Is this un update? ';
  $msg .= $update ? 'Yes.' : 'No.';
  wp_die( $msg );
}

Ostatnia uwaga dotyczy czasu : musisz upewnić się, że add_actionjest wywoływany przed uruchomieniem akcji, inaczej nie zrobi nic.

Np. Ten kod:

wp_update_post( $post );
add_action( 'save_post', 'my_function', 10, 3 );

nic nie zrobi, ponieważ akcja jest dodawana po wystrzeleniu haka. Tutaj łatwo go rozpoznać, w prawdziwym świecie kod nie zawsze jest taki.

gmazzap
źródło
Myślę, że hak akcji „save_post” jest również uruchamiany po naciśnięciu przycisku Dodaj nowy (post, strona, CPT) na pulpicie nawigacyjnym. Aby zobaczyć siebie, po prostu uruchom ten kod. function save_post_test( $post_id, $post, $update ) { print ' post_id : '; var_export( $post_id ); print ' post : '; var_export( $post ); print ' update : '; var_export( $update ); wp_die( 'save_post hook runs when you click Add New..' ); } add_action( 'save_post', 'save_post_test', 10, 3 );Dlaczego akcja „zapisz_post” działa na Dodaj nowy zamiast na Publikuj? Żeby zrobić post auto-draftu, jak sądzę.
lowtechsun
@lowtechsun Jak powiedziano w A, haki są uruchamiane przy każdej aktualizacji posta, tj. zapisywane w DB. Kiedy klikniesz „Dodaj nowy”, w pobliżu ładowania strony, WP tworzy szkic postu przechowywany w DB, więc haki są uruchamiane.
gmazzap
Dziękuję za to, że do mnie wróciłeś. Właśnie dowiedziałem się o tym wczoraj i pomyślałem, że koncepcja tego jest myląca. To znaczy najpierw otwieram stronę, aby dodać nowy post. Na tym etapie myślałem, że nie stworzyłem jeszcze posta. Dopiero gdy kliknę przycisk Publikuj, pomyślałem, że nowy post został utworzony. Idąc dalej, mam nadzieję, że WP usunie post auto-draftu, jeśli kliknę Dodaj nowy, ale potem opuści stronę bez klikania Publikuj?
lowtechsun
2

Dlaczego nie w hak post_updated_messages. W ten sposób możesz wyświetlić tę wiadomość tak, jak zaktualizowano domyślny post Wordpress.

add_filter('post_updated_messages', 'your_message');

function your_message(){
}

Poszukaj tutaj przykładu:

http://codex.wordpress.org/Function_Reference/register_post_type

pod post_updated_messages

Jacob Rambo
źródło