问题描述

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

虽然我完全知道 update_post_meta 适用于所有的帖子类型,而 update_postmeta 只是工作在 post,我的问题不依赖于帖子类型,它也不仅仅涵盖 update 部分,因为它是相同的 updateddelete 等等

经过 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_metaupdate_comment_metaupdate_user_meta 都有钩子。之后再调用另一个钩子 – 只是为了表格,命名为 update_postmeta,几乎完全相同的方式,唯一的区别是传递了 meta_value 的 maybe_serialize()数据。

线 204:

$_meta_value = $meta_value;
$meta_value = maybe_serialize( $meta_value );

起初我以为第二个钩子是为了向后兼容的,但是这两个都是在 2.9.0 中引入的。 update_postmetaupdate_{$meta_type}_meta

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

我在这里遗漏了什么吗?

毕竟,这种向后兼容性 – 刚刚被移动到 2.9.0 中的 meta.php?还是有什么真正的理由有这两个?对我来说,挂钩到 update_post_meta()功能的动作可以很容易地将 maybe_unserialize()数据,如果需要,所以我真的看不到有两点。

期待您的投入!

最佳解决方案

它们都是在版本 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 钩子总是接收到 maybe_serialize()的值,所以它应该继续这样做,尽管后来被移动到/wp-includes/meta.php

此外,您可能已经知道,但为了其他人的阅读,update_postmeta 钩子返回来自 $_POST['meta']超级全局的数据,并保存来自 custom fields panel 的数据。

这可能是一个糟糕的设计决定吗?看起来像

我以为我回想起了关于数据双重序列化这个问题的其他一些原因,但是我可能会混淆其他的东西。

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

注意:这个答案不是完成的。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。