問題描述

我正在開發一個增強的修訂系統,為用户和/或關於特定帖子類型的元數據的算法所做的所有更改創建一個日誌文件。

雖然我完全知道 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。