WordPress 6.1 對 REST API 進(jìn)行了許多關(guān)鍵改進(jìn),以提高性能。這些改進(jìn)減少了在每個 REST API 請求上運(yùn)行的數(shù)據(jù)庫查詢的數(shù)量。?
避免不必要地準(zhǔn)備項目鏈接
在 WordPress 6.1 之前,prepare_links所有控制器都會調(diào)用 REST API 中的方法。如果將_fields參數(shù)傳遞給 REST API 請求,則可能意味著未請求鏈接字段并且永遠(yuǎn)不會在響應(yīng)中返回。這是一種浪費(fèi),因?yàn)?code>prepare_links它可能包含數(shù)據(jù)庫調(diào)用或其他即使從未返回響應(yīng)也會運(yùn)行的復(fù)雜邏輯。
在 6.1中,prepare_links僅在響應(yīng)中請求時調(diào)用,當(dāng)在字段中請求鏈接或_embedded傳遞參數(shù)時。作為這項工作的一部分,分類和文章類型控制器現(xiàn)已更新,以實(shí)現(xiàn)上述prepare_links方法,使它們與其他 REST API 控制器保持一致。?
以下是在自定義 REST API 控制器中實(shí)現(xiàn)此更改的代碼示例。
更改之前
$response = rest_ensure_response( $data );
$links = $this->prepare_links( $post );
$response->add_links( $links );
return $response;
更改之后
$response = rest_ensure_response( $data );
if ( rest_is_field_included( '_links', $fields ) || rest_is_field_included( '_embedded', $fields ) ) {
$links = $this->prepare_links( $post );
$response->add_links( $links );
}
return $response;
此邏輯僅在_links或_embedded被請求時有條件地調(diào)用 prepare_links 。
有關(guān)更多信息,請參閱Trac?工單:#52992、#56019、#56020
Posts 控制器的改進(jìn)
在針對 REST API 請求的響應(yīng)運(yùn)行分析工具時,發(fā)現(xiàn) post 控制器會向每個 post 請求大量鏈接數(shù)據(jù)。例如,在 REST API 響應(yīng)中返回文章時,所有鏈接的數(shù)據(jù),如作者(用戶)、特色圖像和父帖子都被請求。由于這些鏈接的項目沒有在緩存中準(zhǔn)備好,這可能意味著對于 REST API 響應(yīng)中的每個帖子,將有 3 個單獨(dú)的數(shù)據(jù)庫查詢:一個用于用戶,一個用于特色圖像,另一個用于父帖子。?
在 WordPress 6.1 中,所有緩存都在單個數(shù)據(jù)庫查詢中啟動,并且有新的輔助函數(shù)可以實(shí)現(xiàn)這一點(diǎn):
update_post_author_caches:在單個查詢中獲取一組帖子并準(zhǔn)備用戶緩存。?
update_post_parent_caches:在單個查詢中獲取一組帖子和父帖子。?
update_menu_item_cache:在單個查詢獲取一系列帖子并將帖子/術(shù)語鏈接到菜單項。?
現(xiàn)有的update_post_thumbnail_cache函數(shù)用于準(zhǔn)備特色圖像緩存。這些功能也正在推廣到內(nèi)核的其他部分,這些部分可以從在一個地方啟動緩存中受益。?
有關(guān)更多信息,請參閱 Trac 工單:#55592、#55593、#55620????
對其他控制器的改進(jìn)
評論和用戶控制器也得到了改進(jìn):用戶控制器現(xiàn)在在單個查詢中啟動用戶元,評論控制器現(xiàn)在在單個查詢中啟動鏈接的帖子緩存。對搜索后控制器進(jìn)行了改進(jìn),以提高數(shù)據(jù)庫性能以及媒體控制器。
有關(guān)更多信息,請參閱 Trac 工單:#55674、#56272、#55677、#55716




