我仍在努力使事情陷入困境,因此我真的很想尝试执行以下任务:

如果update_post_meta被解雇了,请检查meta_key是否等于某事(如果使用特定的meta_key,我想触发一些代码)。如果我要查找的元密钥,请运行一些代码,该代码将需要知道要更新的元密钥的$post->ID。上面的。

任何人都可以给我提供一些示例代码来钩住delete_post_metaupdate_post_meta吗?

#1 楼

从更通用的update_post_meta函数调用update_metadata()挂钩,因此您可能没有直接找到它。这三个钩子是:update_post_metadata,一个过滤器,使您可以“劫持”元数据更新并执行其他操作。如果连接了一个返回布尔值的函数,则执行将在此处停止并返回布尔值。

update_post_meta,该操作在数据库中的数据更新之前被调用。

updated_post_meta,这是在数据库中更新数据后调用的操作。

如果数据库中尚不存在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 );
    }
}


评论


超级谢谢。我知道使用update_metadata的update_post_meta,在那里,有关于add_post_meta和updated_post_meta的钩子,但是那是我所能得到的。我不知道该怎么用。但是现在我想我已经明白了:)

–斯科特
2011年5月10日12:34

更具体地说,挂钩已更新_ {$$ post_type} _meta

–本杰明·因塔尔(Benjamin Intal)
2015年8月8日在3:46

是否有可能挂钩到通过REST API更新后meta的位置?我想做到这样,当仅通过其余API更新发布元时,就会创建发布修订。

–阿姆贾德
20-2-13在18:52

#2 楼

除了从“编辑帖子”页面删除自定义元数据的情况外,“简”答案涵盖了以上内容。一旦您通过调用wp-admin / admin-ajax.php来单击元数据下的“删除”按钮,就会异步发生。不幸的是,该调用绕过了meta.php中的delete_metadata()函数,而是调用了wp-admin / includes / post.php中的delete_meta()(不要与wp-includes / post.php混淆)。

尽管仍然可以使用2个动作,分别是delete_postmeta(删除前)和deleted_postmeta(删除后)。两者都接受单个参数$mid,它是元数据的ID(不是密钥)。您可以使用以下方法检索元数据对象:

$meta = get_post_meta_by_id($mid);  


,它返回一个带有meta_id,post_id,meta_key和meta_value的对象。当然,在调用deleted_postmeta时,元数据已被删除,因此get_post_meta_by_id()将无法工作(这会使该操作无效)。

从“编辑帖子”页面更新自定义元数据也同样适用。 meta.php中的update_metadata()函数(及其动作)未调用,而wp-admin / includes / post.php中的update_meta()函数却被调用。此处再次执行两个操作update_postmetaupdated_postmeta。 args是$ meta_id,$ post_id,$ meta_key,$ meta_value。