Answers:
这些update_post_meta
挂钩是从更通用的update_metadata()
函数中调用的,因此您可能没有直接找到它。三个钩子是:
update_post_metadata
,这是一个过滤器,可让您“劫持”元数据更新并执行其他操作。如果连接了一个返回布尔值的函数,则执行将在此处停止并返回布尔值。update_post_meta
,该操作在数据库中的数据更新之前被调用。updated_post_meta
,是在数据库中更新数据后调用的操作。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 );
}
}
updated_{$post_type}_meta
除了从“编辑帖子”页面删除自定义元数据的情况以外,“简”答案涵盖了上面的内容。一旦您通过调用wp-admin / admin-ajax.php来单击元数据下的“删除”按钮,就会异步发生。不幸的是,该调用绕过了delete_metadata()
meta.php中的函数,而是调用delete_meta()
了wp-admin / includes / post.php(不要与wp-includes / post.php混淆)。
不过,delete_postmeta
(删除前)和deleted_postmeta
(删除后)仍有2种操作仍可以使用。两者都接受一个参数$mid
,它是元数据的ID(而不是键)。您可以使用以下方法检索元数据对象:
$meta = get_post_meta_by_id($mid);
它返回一个带有meta_id,post_id,meta_key和meta_value的对象。当然,到时候deleted_postmeta
被称为元数据已被删除,因此get_post_meta_by_id()
将无法正常工作(这会使该操作无用)
从“编辑帖子”页面更新自定义元数据也是如此。update_metadata()
meta.php中的函数(及其动作)未调用,但update_meta()
wp-admin / includes / post.php中的函数被调用。两个动作再次在这里,update_postmeta
和updated_postmeta
。args是$ meta_id,$ post_id,$ meta_key,$ meta_value。
update_post_meta
使用它update_metadata
,在那里,有钩子added_post_meta
,updated_post_meta
但那是我所能得到的。我不知道该怎么用。但是现在我想我已经明白了:)