问题描述

我仍然努力让我的头围绕整个挂钩的东西,所以我真的坚持尝试做以下任务:

如果 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。