天天看點

WordPress 6.3 改進和增強了 Meta 資料的能力和延遲加載功能

作者:WordPress果醬

WordPress 6.3 改進和增強了 Meta 資料的能力,增強了分類/标簽、評論和站點的 Meta 資料的延遲加載功能,這些改進是為了提高性能和代碼可讀性,并確定在不同 Meta 資料類型之間一緻的開發者體驗。

這裡首先說明一下,在 WordPress 中,延遲加載 Meta 資料功能是指即僅在實際需要時加載與各種元素相關聯的 Meta 資料的一種技術。與一開始就擷取和加載所有 Meta 資料不同,延遲加載是将 Meta 資料推到一個隊列中,直到請求特定類型的 Meta 資料時才一起加載,進而減少不必要的資料庫查詢或緩存查找,提高整體性能。

分類/标簽 Meta 資料延遲加載改進

自從 WordPress 4.4 引入延遲加載之後,分類/标簽的 Meta 資料一直是延遲加載的,然而延遲加載行為僅适用于 WP_Query 中,在其他核心元件(如 WP_Term_Query)中,分類/标簽的 Meta 資料預設總是被提前加載,除非開發者顯式地将 update_term_meta_cache 參數設定為 false,但是許多開發者都忽略了這個參數,導緻了分類/标簽的 Meta 資料的不必要加載。

WordPress 6.3 開始改進了 WP_Term_Query,不再提前加載分類/标簽的 Meta 資料,而是将其添加到專門用于加載分類/标簽的 Meta 資料的隊列中,這個隊列是通過存儲在目前線程的記憶體中的數組實作,性能優越。此外,它還允許開發者在預期稍後需要分類/标簽 ID 時友善地包含它們,隻有在第一次調用 get_term_meta 函數時,分類/标簽的 Meta 中繼資料才會在單個請求中加載。

為了改進分類/标簽的 Meta 資料的延遲加載,核心代碼中引入了一個名為 wp_lazyload_term_meta()的函數,它為處理分類/标簽的 Meta 資料提供了一種高效的機制,并有助于優化 WordPress 的整體性能。使用它非常簡單,隻需将一個分類/标簽的 ID 數組傳遞給該函數,如下所示:

wp_lazyload_term_meta( array( 1, 2, 3 ) );           

WordPress 6.3 對 WP_Query 中分類/标簽的 Meta 資料的處理引入了更多改進,調用函數 wp_queue_posts_for_term_meta_lazyload 将所有與查詢文章相關聯的分類/标簽的 ID 添加到延遲加載 Meta 資料隊列中,之前 WordPress 6.2 中對這個函數進行了改進,通過使用 wp_cache_get_multiple() 提高了這個函數的性能。

還去除了一個不必要的檢查以驗證分類/标簽的存在,是以當調用 wp_queue_posts_for_term_meta_lazyload() 時,它不再為每個 ID 執行 get_term,因為不存在的可能性非常小。

評論 Meta 資料延遲加載改進

與分類/标簽的 Meta 資料類似,之前 WordPress 中的評論 Meta 資料僅在 WP_Query 中被延遲加載,現在,在 WP_Comment_Query 類中,也不再提前加載評論的 Meta 資料,而是将其添加到延遲加載 Meta 資料隊列中,并僅在使用時加載,這使得分類/标簽和評論的 Meta 資料之間的邏輯保持一緻,同時使代碼更加易讀,是以 wp_queue_comments_for_comment_meta_lazyload() 函數現在不再需要,已被棄用。

站點 Meta 資料也支援延遲加載

站點 Meta 資料(Site meta)可以讓開發者為多站點網絡中的站點添加 Meta 資料來擴充多站點功能,不要把站點 Meta 資料和網絡 Meta 資料(network meta)搞混,後者用于網絡選項,站點 Meta 資料在核心中隻在一個地方被使用,它主要是為插件使用而設計。

之前調用 WP_Site_Query 或 get_sites() 時,開發者必須向查詢傳遞一個 update_site_meta_cache 參數,以確定站點 Meta 資料不被提前加載,進而導緻緩存查找或資料庫查詢。現在當 update_site_meta_cache 為 true 時,站點 ID 将被添加到隊列中,然後一旦調用 get_site_meta(),隊列中的所有 ID 都将在一次就被調用并被加載。

同樣為了友善調用,核心代碼中也添加了一個新函數,用于将站點 ID 添加到隊列,名為 wp_lazyload_site_meta(),它可以通過傳遞一個站點 ID 數組來使用:

wp_lazyload_site_meta( array( 1, 2, 3 ) );           

延遲加載的一般改進

負責延遲加載中繼資料的 WP_Metadata_Lazyloader 類經過了重構,以提高代碼的可維護性,作為這次重構的一部分,該類的 lazyload_term_meta 和 lazyload_comment_meta 方法已被棄用,這些方法已被更通用的 lazyload_meta_callback 方法替代,該方法可重複用于任何 MEta 資料類型。

如果您的代碼中使用了 lazyload_term_meta 和 lazyload_comment_meta 方法,建議轉換為使用 lazyload_meta_callback,這一改進使 Meta 資料 API 易于擴充,以便在未來支援其他中繼資料類型,如文章和使用者。

延遲加載 Meta 資料還有進一步的改進,首先實作了驗證在處理前請求的 ID 是否已經在隊列中,比如已将三個項目(ID 5、6 和 7)添加到 Meta 資料懶加載隊列中,然而,當調用 get_term_meta 函數時,請求 的 ID 9,它不在隊列中,在 6.3 之前将會導緻額外的資料庫或緩存查詢,而最新的改進,則在處理前檢查隊列以檢視目前 ID 是否已經在隊列中,如果沒有,則将 ID 添加到隊列,防止不必要的查詢。

評論、分類/标簽和站點的 Meta 資料處理發生了重大變化,在更新的實作中,_prime_term_cache() 和 WP_Term_Query 等函數中的 prime meta 參數始終受到尊重。然而現在不是直接提前加載 Meta 資料,而是将其添加到 Meta 資料隊列中,以前,這些函數和類中存在一緻性問題。例如,在 _prime_term_cache() 中,如果分類/标簽已經存在于緩存中,分類/标簽 Meta 資料将不會被提前加載,這導緻了令開發者困惑的體驗和性能下降。

現在通過最新的改進,将 ID 添加到隊列時,請求時幾乎沒有性能影響。是以,這些函數和類預計将以更可預測的方式運作,開發者可以依賴評論、分類/标簽和站點的 Meta 資料處理方面的一緻行為和提高的性能。

繼續閱讀