问题描述
我仍然努力让我的头围绕整个挂钩的东西,所以我真的坚持尝试做以下任务:
如果 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_metadata
,add_post_meta
和 added_post_meta
。这是在 update[d]_post_meta
被调用之前发生的。因此,如果要在添加或更新元键时执行某些操作,请确保挂接到 update*
和 add*
钩子中 – 但请注意,updated_*
和 added_*
操作通过相似的参数时,update_*
和 add_*
不会 (add_post_meta
) 不通过元 ID 首先)
delete_metadata()
具有类似的钩:delete_post_metadata
,delete_post_meta
和 deleted_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_postmeta
和 updated_postmeta
两个动作。参数是 $ meta_id,$ post_id,$ meta_key,$ meta_value 。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。