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但那是我所能得到的。我不知道该怎么用。但是现在我想我已经明白了:)