Jak zaczepić update_post_meta i delete_post_meta?

29

Wciąż staram się ominąć całą sprawę, więc naprawdę utknąłem przy próbie wykonania następującego zadania:

Jeśli update_post_metajest uruchamiany, sprawdź, czy wartość meta_keyjest równa czemuś (chcę wyzwolić jakiś kod, jeśli użyty jest określony klucz meta_). Jeśli szukam meta-klucza, uruchom kod, który będzie wymagał znajomości $post->IDaktualizowanego meta-klucza.

Muszę się przyłączyć do tego, delete_post_metaco robi odwrotnie, jak powyżej.

Czy ktoś może podać mi przykładowy kod do podłączenia update_post_metai delete_post_meta?

Brady
źródło

Odpowiedzi:

45

Te update_post_metahaki są wywoływane z bardziej ogólny update_metadata()funkcji, więc nie mógł znaleźć go bezpośrednio. Trzy haki to:

  • update_post_metadata, filtr, który pozwala „przejąć” aktualizację metadanych i zrobić coś innego. Jeśli podłączysz funkcję, która zwraca wartość logiczną, wykonanie zatrzymuje się na niej i zwracana jest wartość logiczna.
  • update_post_meta, akcja wywoływana przed zaktualizowaniem danych w bazie danych.
  • updated_post_meta, akcja wywoływana po aktualizacji danych w bazie danych.

Jeśli klucz meta nie istnieje w bazie danych jeszcze, update_metadata()przechodzi kontrolę add_metadata(), która ma podobne haki add_post_metadata, add_post_metai added_post_meta. Dzieje się tak, zanim update[d]_post_metazostanie wywołany. Jeśli więc chcesz coś zrobić, gdy dodawany lub aktualizowany jest klucz meta , pamiętaj, aby podłączyć zarówno haki, jak update*i add*haki - ale zauważ, że podczas gdy akcje updated_*i added_*przekazują podobne parametry, update_*a add_*nie ( add_post_metanajpierw nie przekazuje meta ID) .

delete_metadata()ma podobne haki: delete_post_metadata, delete_post_metai deleted_post_meta.

Przykładowy kod:

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 );
    }
}
Jan Fabry
źródło
super dzięki za to. Byłem świadomy o update_post_metaużyciu update_metadatai tam nie było haczyków added_post_metai updated_post_metaale to tak daleko, jak mogę dostać. Nie zrozumiałem, jak używać. Ale teraz myślę, że mam :)
Brady,
3
Mówiąc dokładniej, haczyk toupdated_{$post_type}_meta
Benjamin Intal
8

Janowa odpowiedź obejmuje prawie wszystko powyżej, z wyjątkiem przypadku, gdy niestandardowe metadane są usuwane ze strony Edytuj wpis. Dzieje się tak asynchronicznie, jak tylko klikniesz przycisk „Usuń” pod metadanymi, poprzez połączenie z wp-admin / admin-ajax.php. Niestety, te wywołania omijają delete_metadata()funkcję w meta.php, a delete_meta()zamiast tego w wp-admin / obejmuje / post.php (nie mylić z wp-include / post.php).

Istnieją jednak 2 akcje, których można nadal użyć delete_postmeta(przed usunięciem) i deleted_postmeta(po usunięciu). Oba akceptują pojedynczy parametr $mid, który jest identyfikatorem metadanych (a nie klucza). Możesz pobrać obiekt metadanych, używając:

$meta = get_post_meta_by_id($mid);  

który zwraca obiekt o meta_id, post_id, meta_key abd meta_value. Oczywiście do czasu, gdy deleted_postmetanazywa się to, metadane zostały usunięte, więc get_post_meta_by_id()nie będzie działać (co w pewien sposób czyni tę akcję bezużyteczną)

To samo dotyczy aktualizacji niestandardowych metadanych ze strony Edytuj post. update_metadata()Funkcja (i jego działania) w meta.php się nie nazywa, ale update_meta()funkcja w wp-admin / includes / post.php jest zamiast. Jeszcze dwie akcje tutaj update_postmetai updated_postmeta. Argumentami są: $ meta_id, $ post_id, $ meta_key, $ meta_value.

sebastien.b
źródło