問題描述

我仍然努力讓我的頭圍繞整個掛鉤的東西,所以我真的堅持嘗試做以下任務:

如果 update_post_meta 被觸發,請檢查 meta_key 是否等於某事 (如果使用特定的 meta_key,我想觸發一些程式碼) 。如果我正在尋找的元鍵,那麼執行一些程式碼,需要知道正在更新的元鍵的 $post->ID

我也需要掛鉤到 delete_post_meta 那樣的反向,如上所述。

有人可以為我提供一些掛鉤到 update_post_meta 和 delete_post_meta 的示例程式碼?

最佳解決方案

update_post_meta 鉤子從更通用的 update_metadata()功能呼叫,因此您可能沒有直接找到它。三個鉤子是:

  • update_post_metadata,一個過濾器,它允許您將後設資料更新到”hijack” 並執行其他操作。如果你連線一個返回一個布林值的函式,那麼執行就停止並返回布林值。

  • update_post_meta 是在資料庫中更新資料之前呼叫的操作。

  • updated_post_meta 是在資料庫中更新資料後呼叫的操作。

如果資料庫中沒有元金鑰,update_metadata()將控制權傳遞給 add_metadata(),它具有類似的鉤 add_post_metadataadd_post_metaadded_post_meta 。這是在 update[d]_post_meta 被呼叫之前發生的。因此,如果要在新增或更新元鍵時執行某些操作,請確保掛接到 update*add*鉤子中 – 但請注意,updated_*added_*操作透過相似的引數時,update_*add_*不會 (add_post_meta) 不透過元 ID 首先)

delete_metadata()具有類似的鉤:delete_post_metadatadelete_post_metadeleted_post_meta

示例程式碼:

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 答案涵蓋了以上幾點,除了從 「編輯帖子」 頁面中刪除自定義後設資料的情況之外。一旦您單擊後設資料上的”Delete” 按鈕,透過呼叫 wp-admin /admin-ajax.php,就會非同步發生。不幸的是,這個呼叫繞過了 meta.php 中的 delete_metadata()函式,並在 wp-admin /includes /post.php 中呼叫 delete_meta()(而不是與 wp-includes /post.php 混淆) 。

delete_postmeta(刪除前) 和 deleted_postmeta(刪除後) 仍然可以使用 2 個動作。兩者都接受單個引數 $mid,它是後設資料的 ID(而不是金鑰) 。您可以使用以下方式檢索後設資料物件:

$meta = get_post_meta_by_id($mid);  

它使用 meta_id,post_id,meta_key abd meta_value 返回一個物件。當然 deleted_postmeta 被稱為後設資料已被刪除,所以 get_post_meta_by_id()將無法正常工作 (哪一種使得該動作無效)

從 「編輯帖子」 頁面更新自定義後設資料也是如此。不呼叫 meta.php 中的 update_metadata()函式 (及其動作),而是在 wp-admin 中包含/post.php 中的 update_meta()函式。 update_postmetaupdated_postmeta 兩個動作。引數是 $ meta_id,$ post_id,$ meta_key,$ meta_value 。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。