UPDATE_POST_META和UPDATE_POST_META挂钩有什么不同?

时间:2016-02-08 作者:fischi

我正在开发一个增强的修订系统,以创建一个日志文件,记录用户和/或算法对附加到特定帖子类型的元数据所做的所有更改。

虽然我很清楚update_post_meta 适用于所有帖子类型,而update_postmeta 我的问题不取决于帖子的类型,也不包括update 零件,因为对于updated, delete, 等

检查后wp-includes/meta.php, 我找到了前面提到的钩子来完成我的工作,但这给我提出了一个问题。

核心部分是版本4.4.2中的一行215:

foreach ( $meta_ids as $meta_id ) {
    /**
     * Fires immediately before updating metadata of a specific type.
     *
     * The dynamic portion of the hook, `$meta_type`, refers to the meta
     * object type (comment, post, or user).
     *
     * @since 2.9.0
     *
     * @param int    $meta_id    ID of the metadata entry to update.
     * @param int    $object_id  Object ID.
     * @param string $meta_key   Meta key.
     * @param mixed  $meta_value Meta value.
     */
    do_action( "update_{$meta_type}_meta", $meta_id, $object_id, $meta_key, $_meta_value );
}

if ( \'post\' == $meta_type ) {
    foreach ( $meta_ids as $meta_id ) {
        /**
         * Fires immediately before updating a post\'s metadata.
         *
         * @since 2.9.0
         *
         * @param int    $meta_id    ID of metadata entry to update.
         * @param int    $object_id  Object ID.
         * @param string $meta_key   Meta key.
         * @param mixed  $meta_value Meta value.
         */
        do_action( \'update_postmeta\', $meta_id, $object_id, $meta_key, $meta_value );
    }
}
所以有一个钩子update_post_meta, update_comment_meta, 和update_user_meta. 紧接着调用另一个钩子-仅针对posts表,名为update_postmeta, 工作方式几乎完全相同,唯一的区别是maybe_serialize() 传递meta\\u值的数据。

第204行:

$_meta_value = $meta_value;
$meta_value = maybe_serialize( $meta_value );
起初我认为第二个钩子是为了向后兼容,但这两个钩子都是在2.9.0中引入的。update_postmetaupdate_{$meta_type}_meta

再看远一点,我也找到了我的另一个答案,三年前,这个话题也出现了,但这不是重点。

我错过什么了吗?

这到底是向后兼容吗?而且刚刚被移动到meta.php 在2.9.0中?或者有什么真正的理由同时拥有这两个吗?对我来说update_post_meta() 功能可以轻松maybe_unserialize() 数据,如果需要的话,所以我真的不认为两者都有意义。

期待您的意见!

2 个回复
最合适的回答,由SO网友:Adam 整理而成

它们都是在版本2.9中引入的,但都是在不同的文件中引入的。

update_postmeta 进入/wp-admin/includes/post.php

虽然

update_{$meta_type}_meta 进入/wp-includes/meta.php

直到后来update_postmeta 已转移到/wp-includes/meta.php.

所以我认为这是为了向后兼容,因为update_postmeta hook总是收到maybe_serialize() 那么它应该继续这样做,尽管后来被转移到/wp-includes/meta.php.

此外,您可能已经知道,但为了其他读者的阅读update_postmeta 钩子从返回数据$_POST[\'meta\'] 超全局和键,用于保存来自custom fields panel.

这可能只是一个糟糕的设计决策吗?看起来是这样的。

我想我想起了与数据双重序列化相关的这个问题的其他一些原因,但是我可能会与其他一些问题混淆

有趣的是,如果您将已经序列化的数据存储在自定义字段UI textarea中,WordPress将在存储之前再次对其进行序列化,这支持了与以下内容相关的向后兼容性的概念:

注:this answer is not neccessarily complete.

SO网友:R. Simon

正如Wordpress Codex中所指出的,add_post_meta 插入与帖子关联的新postmeta。如果提供的参数“unique”为true,则将检查同名的现有密钥。如果存在,则绕过它;如果不存在,则创建并赋值

update_post_meta 将更新元数据并创建新的键和值对(如果提供的meta\\u键不存在)。

What is the best to use? 视情况而定。update\\u post\\u meta适合大多数情况,但如果需要在受限制的环境中添加元数据(例如,共享主机),有时add\\u post\\u meta可以完成这项工作。

请阅读了解更多信息:https://codex.wordpress.org/Function_Reference/update_post_metahttps://codex.wordpress.org/Function_Reference/add_post_meta

相关推荐

运行wp core安装时,wp-cli静默失败,错误为255

在Docker容器(circleci/php:最新)中工作,我有点难以使用wp cli。当我尝试跑步时wp core install 我收到一个带有255个退出代码的无声故障。我启用了--debug,希望获得更多信息,但不幸的是,我只能看到它在读取wp config后停止。php。circleci@142b5627c098:~/wordpress$ wp core install --url=example.com --title=\"Example\" --admin_user=admin --admi