Care este modalitatea corectă de a folosi hook-ul pentru actualizarea articolelor

14 feb. 2014, 18:23:23
Vizualizări: 88.4K
Voturi: 38

Am încercat să folosesc un hook când articolul este actualizat, dar toate hook-urile pe care le-am încercat nu s-au executat, cu excepția updated_post_meta

add_action('updated_post_meta', 'my_function');

function my_function($post_id) {    
    echo 'Acesta este ID-ul articolului meu: '.$post_id;
}

Am încercat și add_action('save_post', 'my_function'); dar niciun ID nu a fost afișat, sau poate acest mesaj a fost deja afișat dar nu a fost randat din cauza că headerul de redirecționare a fost deja trimis.

3
Comentarii

ai un spațiu după save_post, este o greșeală de tipar aici sau era în codul tău original? de asemenea, activează depanarea în timpul dezvoltării.

Milo Milo
14 feb. 2014 18:31:47

@Milo scuze, greșeală de tipar, dar nu în codul original

rusly rusly
14 feb. 2014 18:38:03

dacă este cazul, atunci ar trebui să vezi rezultatul în colțul din stânga sus al ecranului când creezi un post nou. salvarea unui post existent se întâmplă înainte de o redirecționare, așa că nu vei vedea nimic decât dacă ai depanarea activată.

Milo Milo
14 feb. 2014 18:42:36
Toate răspunsurile la întrebare 2
3
102

Când un articol este actualizat, sunt declanșate câteva hook-uri:

  • 'pre_post_update' este un acțiune declanșată chiar înainte ca articolul să fie actualizat, argumentele transmise sunt 2: $post_ID și $data care este un array cu toate celelalte coloane din tabela articolului
  • 'transition_post_status' este un hook declanșat la actualizare și primește 3 argumente: $new_post_status, $old_post_status și $post (obiect).
  • Apoi, sunt declanșate alte 2 hook-uri de tranziție, dar acestea au nume dinamice, ceea ce înseamnă că acțiunea efectivă declanșată depinde de vechiul și noul status al articolului. "{$old_status}_to_{$new_status}" și "{$new_status}_{$post->post_type}". Primul primește doar obiectul articolului ca argument, al doilea primește ID-ul articolului și obiectul articolului. Găsiți documentația aici.
  • 'edit_post' care primește 2 argumente: $post_ID și $post (obiect)
  • 'post_updated' care primește 3 argumente: $post_ID, $post_after (obiectul articolului după actualizare), $post_before (obiectul articolului înainte de actualizare)
  • Un alt hook dinamic: "save_post_{$post->post_type}" care depinde de tipul de articol, de exemplu pentru articolele standard este 'save_post_post' și pentru pagini este 'save_post_page', acest hook primește 3 argumente: $post_ID, $post (obiect) și $update care este un boolean (adevărat sau fals) care este adevărat când se efectuează o actualizare, de fapt acest hook este declanșat și când un articol este salvat pentru prima dată.
  • 'save_post' care este declanșat atât la actualizare, cât și la prima salvare, și primește aceleași 3 argumente ca și hook-ul anterior.
  • 'save_post_{$post_type}' care este declanșat atât la actualizare, cât și la prima salvare, și primește aceleași prime 2 argumente ca și hook-ul anterior.
  • În final, aveți 'wp_insert_post', care este declanșat atât la actualizare, cât și la prima salvare, și primește aceleași 3 argumente ca și cele 2 hook-uri anterioare.

Aceste hook-uri sunt declanșate de fiecare dată când un articol este actualizat, atât prin paginile de administrare din backend, cât și când este actualizat "manual" folosind funcțiile wp_update_post sau wp_insert_post.

Când articolul este actualizat folosind paginile de administrare, sunt declanșate hook-uri suplimentare, un exemplu este 'update_post_redirect' sau 'post_updated_messages'. (Consultați acesta și acesta răspunsuri WPSE pentru exemple de utilizare).

Rețineți că dacă doriți să utilizați un argument al unui hook care nu este primul, trebuie să-l declarați explicit în apelul add_action.

De exemplu, dacă doriți să utilizați argumentul '$update' (care este al 3-lea) al hook-ului 'save_post', trebuie să adăugați 3 ca parametru $accepted_args în add_action (vezi documentația):

// dacă nu adăugați 3 ca al 4-lea argument, acest cod nu va funcționa cum te așteptai
add_action( 'save_post', 'my_save_post_function', 10, 3 );

function my_save_post_function( $post_ID, $post, $update ) {
  $msg = 'Este aceasta o actualizare? ';
  $msg .= $update ? 'Da.' : 'Nu.';
  wp_die( $msg );
}

Ultima notă se referă la timpul: trebuie să vă asigurați că add_action este apelat înainte ca acțiunea să fie declanșată, altfel nu va face nimic.

De exemplu, acest cod:

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

nu va face nimic, deoarece acțiunea este adăugată după ce hook-ul a fost declanșat. Aici este ușor de recunoscut, dar în codul real nu este întotdeauna așa.

14 feb. 2014 19:08:28
Comentarii

Cred că acțiunea 'save_post' este declanșată și atunci când apeși pe Adaugă nou (Postare, Pagină, CPT) în panoul de control. Pentru a verifica, rulează acest cod. `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 );` De ce rulează acțiunea 'save_post' la Adaugă nou în loc să ruleze la Publicare? Presupun că este pentru a crea postarea automată ca draft.

lowtechsun lowtechsun
12 nov. 2018 19:52:37

@lowtechsun După cum se menționează în răspuns, aceste acțiuni sunt declanșate de fiecare dată când o postare este actualizată, adică salvată în baza de date. Când apeși "Adaugă nou", aproape de încărcarea paginii, WP creează o postare draft salvată în baza de date, deci acțiunile sunt declanșate.

gmazzap gmazzap
13 nov. 2018 11:14:52

Mulțumesc pentru răspuns. Am aflat despre asta ieri și am considerat că acest concept este confuz. Adică mai întâi deschid pagina pentru a adăuga o postare nouă. În această etapă am crezut că nu am creat deja o postare. Doar după ce apăs Publicare aș fi crezut că postarea nouă este creată. Mergând mai departe, sper că WP șterge postarea draft automată dacă apăs Adaugă nou dar apoi părăsesc pagina fără să apăs Publicare?

lowtechsun lowtechsun
13 nov. 2018 11:18:21
0

De ce să nu folosești hook-ul post_updated_messages. În felul acesta poți afișa acest mesaj exact ca mesajul standard WordPress pentru actualizarea postării.

add_filter('post_updated_messages', 'mesajul_tau');

function mesajul_tau(){
}

Caută un exemplu aici:

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

sub secțiunea post_updated_messages

14 feb. 2014 18:39:03