問題描述

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

如果 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。