如何挂钩update_post_meta和delete_post_meta?


29

我仍然在全力以赴地投入工作,因此我真的坚持尝试执行以下任务:

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

我也需要delete_post_meta像上面那样做相反的事情。

谁能为我提供一些示例代码来钩住update_post_metadelete_post_meta

Answers:


45

这些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_post_meta使用它update_metadata,在那里,有钩子added_post_metaupdated_post_meta但那是我所能得到的。我不知道该怎么用。但是现在我想我已经明白了:)
布雷迪(Brady)

3
更具体地讲,挂钩是updated_{$post_type}_meta
Benjamin Intal,2015年

8

除了从“编辑帖子”页面删除自定义元数据的情况以外,“简”答案涵盖了上面的内容。一旦您通过调用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_postmetaupdated_postmeta。args是$ meta_id,$ post_id,$ meta_key,$ meta_value。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.