Bagaimana cara mengaitkan update_post_meta dan delete_post_meta?

29

Saya masih berusaha keras untuk mengaitkan seluruh masalah ini, jadi saya benar-benar terjebak dalam mencoba melakukan tugas berikut:

Jika update_post_metadipecat maka periksa untuk melihat apakah meta_keyitu sama dengan sesuatu (saya ingin memicu beberapa kode jika meta_key tertentu digunakan). Jika kunci meta yang saya cari, jalankan beberapa kode yang perlu mengetahui $post->IDkunci meta yang sedang diperbarui.

Saya perlu menghubungkan ke dalam delete_post_metajuga melakukan sebaliknya seperti di atas.

Adakah yang bisa memberi saya beberapa contoh kode untuk menghubungkan ke update_post_metadan delete_post_meta?

Brady
sumber

Jawaban:

45

The update_post_metakait disebut dari lebih generik update_metadata()fungsi, sehingga Anda tidak mungkin telah menemukan secara langsung. Tiga kait itu adalah:

  • update_post_metadata, filter yang memungkinkan Anda untuk "membajak" pembaruan metadata dan melakukan sesuatu yang lain. Jika Anda menghubungkan fungsi yang mengembalikan boolean, eksekusi berhenti di sana dan boolean dikembalikan.
  • update_post_meta, suatu tindakan yang dipanggil sebelum data diperbarui dalam database.
  • updated_post_meta, suatu tindakan yang dipanggil setelah data diperbarui dalam database.

Jika kunci meta tidak ada dalam database belum, update_metadata()melewati kontrol ke add_metadata(), yang memiliki kait yang sama add_post_metadata, add_post_meta, dan added_post_meta. Ini terjadi sebelum update[d]_post_metadipanggil. Jadi jika Anda ingin melakukan sesuatu ketika kunci meta ditambahkan atau diperbarui, pastikan untuk menghubungkan ke kait update*dan add*kait - tetapi perhatikan bahwa sementara updated_*dan added_*tindakan melewati parameter yang sama, update_*dan add_*jangan ( add_post_metatidak melewati meta ID terlebih dahulu) .

delete_metadata()memiliki kait yang sama: delete_post_metadata, delete_post_metadan deleted_post_meta.

Kode sampel:

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
sumber
Super thx untuk ini. Saya sadar tentang update_post_metamenggunakan update_metadatadan di sana, ada kait untuk added_post_metadan updated_post_metatapi itu sejauh yang saya bisa dapatkan. Saya tidak mengerti bagaimana cara menggunakannya. Tapi sekarang saya pikir saya sudah mendapatkannya :)
Brady
3
Lebih khusus lagi, kaitnya adalahupdated_{$post_type}_meta
Benjamin Intal
8

Jawaban Jan mencakup cukup banyak di atas kecuali untuk kasus di mana metadata khusus dihapus dari halaman Edit Post. Ini terjadi secara tidak sinkron segera setelah Anda mengklik tombol "Hapus" di bawah metadata, melalui panggilan ke wp-admin / admin-ajax.php. Sayangnya, panggilan itu memintas delete_metadata()fungsi di meta.php dan panggilan delete_meta()di wp-admin / include / post.php sebagai gantinya (jangan dikacaukan dengan wp-include / post.php).

Ada 2 tindakan yang masih bisa digunakan, delete_postmeta(sebelum penghapusan), dan deleted_postmeta(setelah penghapusan). Keduanya menerima parameter tunggal $mid, yang merupakan ID dari metadata ( bukan kunci). Anda dapat mengambil objek metadata menggunakan:

$meta = get_post_meta_by_id($mid);  

yang mengembalikan objek dengan meta_id, post_id, meta_key abd meta_value. Tentu saja, pada saat deleted_postmetaitu disebut metadata telah dihapus sehingga get_post_meta_by_id()tidak akan berfungsi (yang membuat tindakan itu tidak berguna)

Hal yang sama berlaku untuk memperbarui metadata khusus dari halaman Edit Posting. The update_metadata()function (dan tindakannya) di meta.php yang tidak disebut, tetapi update_meta()fungsi dalam wp-admin / includes / post.php adalah bukan. Dua tindakan lagi di sini, update_postmetadan updated_postmeta. Args adalah $ meta_id, $ post_id, $ meta_key, $ meta_value.

sebastien.b
sumber