Cum să folosești hook-urile update_post_meta și delete_post_meta?
Încă mă lupt să înțeleg conceptul de hook-uri, așa că sunt blocat în încercarea de a realiza următoarea sarcină:
Dacă update_post_meta
este declanșat, atunci să verific dacă meta_key
este egal cu ceva (vreau să declanșez un cod dacă se utilizează un anumit meta_key). Dacă găsesc meta key-ul pe care îl caut, atunci să execut un cod care va trebui să știe $post->ID
al meta key-ului care se actualizează.
De asemenea, trebuie să folosesc hook-ul delete_post_meta
care face un fel de operațiune inversă față de cea de mai sus.
Poate cineva să-mi ofere niște exemple de cod pentru folosirea hook-urilor update_post_meta
și delete_post_meta
?
Hooks-urile update_post_meta
sunt apelate din funcția mai generică update_metadata()
, așa că s-ar putea să nu le fi găsit direct. Cele trei hooks sunt:
update_post_metadata
, un filtru care vă permite să "deturnați" actualizarea metadatelor și să faceți altceva. Dacă atașați o funcție care returnează o valoare booleană, execuția se oprește acolo și valoarea booleană este returnată.update_post_meta
, o acțiune care este apelată înainte ca datele să fie actualizate în baza de date.updated_post_meta
, o acțiune care este apelată după ce datele au fost actualizate în baza de date.
Dacă cheia meta nu exista deja în baza de date, update_metadata()
transferă controlul către add_metadata()
, care are hooks-uri similare: add_post_metadata
, add_post_meta
și added_post_meta
. Acest lucru se întâmplă înainte ca update[d]_post_meta
să fie apelat. Deci, dacă doriți să faceți ceva atunci când cheia meta este adăugată sau actualizată, asigurați-vă că vă conectați atât la hooks-urile update*
, cât și la cele add*
- dar rețineți că, în timp ce acțiunile updated_*
și added_*
transmit parametri similari, update_*
și add_*
nu o fac (add_post_meta
nu transmite un ID meta pe primul loc).
delete_metadata()
are hooks-uri similare: delete_post_metadata
, delete_post_meta
și deleted_post_meta
.
Exemplu de cod:
add_action( 'added_post_meta', 'wpse16835_after_post_meta', 10, 4 );
add_action( 'updated_post_meta', 'wpse16835_after_post_meta', 10, 4 );
function wpse16835_after_post_meta( $meta_id, $post_id, $meta_key, $meta_value )
{
if ( 'wpse16835_meta_key' == $meta_key ) {
wpse16835_do_something( $post_id, $meta_value );
}
}
add_action( 'deleted_post_meta', 'wpse16835_deleted_post_meta', 10, 4 );
function wpse16835_deleted_post_meta( $deleted_meta_ids, $post_id, $meta_key, $only_delete_these_meta_values )
{
if ( 'wpse16835_meta_key' == $meta_key ) {
wpse16835_undo_something( $post_id );
}
}

super mersi pentru asta. Știam despre update_post_meta
care folosește update_metadata
și acolo erau hook-uri la added_post_meta
și updated_post_meta
dar asta era tot ce am reușit să înțeleg. Nu am înțeles cum să le folosesc. Dar acum cred că am înțeles :)

Răspunsul lui Jan acoperă destul de mult situația de mai sus, cu excepția cazului în care un metadate personalizat este șters din pagina Editare Postare. Acest lucru se întâmplă asincron imediat ce dai clic pe butonul "Șterge" de sub metadate, printr-un apel către wp-admin/admin-ajax.php. Din păcate, acest apel ocolește funcția delete_metadata()
din meta.php și apelează în schimb delete_meta()
din wp-admin/includes/post.php (a nu se confunda cu wp-includes/post.php).
Există totuși 2 acțiuni care pot fi utilizate, delete_postmeta
(înainte de ștergere) și deleted_postmeta
(după ștergere). Ambele acceptă un singur parametru $mid
, care este ID-ul metadatelor (nu cheia). Puteți prelua obiectul metadatelor folosind:
$meta = get_post_meta_by_id($mid);
care returnează un obiect cu meta_id, post_id, meta_key și meta_value. Desigur, până când este apelată deleted_postmeta
, metadatele au fost deja șterse, așa că get_post_meta_by_id()
nu va funcționa (ceea ce face practic această acțiune inutilă).
Același lucru este valabil și pentru actualizarea unui metadate personalizat din pagina Editare Postare. Funcția update_metadata()
(și acțiunile sale) din meta.php nu este apelată, ci în schimb funcția update_meta()
din wp-admin/includes/post.php. Din nou, două acțiuni aici, update_postmeta
și updated_postmeta
. Argumentele sunt $meta_id, $post_id, $meta_key, $meta_value.
