新聞中心

在成都做網(wǎng)站、成都網(wǎng)站制作過程中,需要針對客戶的行業(yè)特點、產(chǎn)品特性、目標受眾和市場情況進行定位分析,以確定網(wǎng)站的風格、色彩、版式、交互等方面的設計方向。成都創(chuàng)新互聯(lián)還需要根據(jù)客戶的需求進行功能模塊的開發(fā)和設計,包括內(nèi)容管理、前臺展示、用戶權(quán)限管理、數(shù)據(jù)統(tǒng)計和安全保護等功能。
作為wordpress開發(fā)人員,我們經(jīng)常需要從WordPress數(shù)據(jù)庫中檢索符合特定條件的文章、頁面和其他內(nèi)容。通常,我們不需要構(gòu)建SQL查詢(通常我們不應該),因為WP_Query類及其方法為我們提供了一種從數(shù)據(jù)庫中檢索數(shù)據(jù)的安全有效的方法。我們只需要聲明一個參數(shù)數(shù)組,$query對象就會構(gòu)建實際的SQL查詢。
在這篇文章中,我將假設您已經(jīng)了解WP_Query類的基礎知識、它的方法和屬性,以及在哪里可以找到可用變量的列表。
我們將重點介紹WP_Query類提供的參數(shù),專門用于優(yōu)化SQL查詢,減少執(zhí)行時間和資源消耗。
當流量和內(nèi)容有限時,我們通常不會關心查詢的效率。WordPress構(gòu)建了優(yōu)化良好的SQL查詢,并提供了一個開箱即用的緩存系統(tǒng)。
當流量和網(wǎng)站內(nèi)容顯著增長時——多達數(shù)千個文章——那么我們必須考慮查詢執(zhí)行時間。
- 我們的工具箱
- WP_Query – 為什么我們不計算行數(shù)
- 緩存或不緩存
- 返回的字段
我們的工具箱
我將向您展示的代碼已經(jīng)通過Query Monitor測試,這是一個免費插件,提供有關查詢性能、觸發(fā)掛鉤、HTTP請求、重寫規(guī)則等的基本信息。
作為插件的替代方案,我們可以強制WordPress存儲查詢信息,在wp-config.php中聲明以下常量:
define( 'SAVEQUERIES', true );
當SAVEQUERIES設置為true時,WordPress會在$wpdb->queries數(shù)組中注冊查詢和一堆有用的信息。因此,調(diào)用者函數(shù)的名稱和每個查詢的執(zhí)行間隔可以通過在像footer.php這樣的模板文件中添加以下代碼來打?。?/p>
if ( current_user_can( 'administrator' ) ) {
global $wpdb;
echo '';
print_r( $wpdb->queries );
echo '
';
}
以下是回顯內(nèi)容的示例:
[4] => Array
(
[0] => SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') ORDER BY wp_posts.post_date DESC LIMIT 0, 10
[1] => 0.0163011550903
[2] => require('wp-blog-header.php'), wp, WP->main, WP->query_posts, WP_Query->query, WP_Query->get_posts, QM_DB->query
[trace] => QM_Backtrace Object
( ... )
[result] => 10
)
如果您想深入研究這個主題,請查看我們的教程: 編輯wp-config.php。最后,考慮到插件和內(nèi)置SAVEQUERIES功能都是開發(fā)工具,我們應該在生產(chǎn)環(huán)境中關閉它們。
話雖如此,讓我們來看看如何加速WordPress查詢。
WP_Query – 為什么我們不計算行數(shù)
我們可以使用get_posts函數(shù)查詢數(shù)據(jù)庫,該函數(shù)返回一個文章數(shù)組或一個新的WP_Query對象實例。在這兩種情況下,我們都可以通過為特定變量設置適當?shù)闹祦泶_定查詢的結(jié)果。
讓我們從一個示例開始,該示例顯示了通常出現(xiàn)在模板文件中的常見循環(huán):
// The Query
$the_query = new WP_Query( $args );
// The Loop
if ( $the_query->have_posts() ) {
while ( $the_query->have_posts() ) : $the_query->the_post();
// Your code here
endwhile;
} else {
// no posts found
}
/* Restore original Post Data */
wp_reset_postdata();
$args是一個鍵/值對數(shù)組。這些對被命名為查詢變量,并決定或影響實際的SQL查詢。從插件查詢數(shù)據(jù)庫時,我們可能更喜歡使用pre_get_posts過濾器,如下例所示:
function myplugin_pre_get_posts( $query ) {
if ( is_admin() || ! $query->is_main_query() ){
return;
}
$query->set( 'category_name', 'webdev' );
}
add_action( 'pre_get_posts', 'myplugin_pre_get_posts', 1 );
這里要注意的重要一點是$query對象是通過引用傳遞的,而不是通過值傳遞,這意味著查詢參數(shù)只是影響現(xiàn)有$query實例。
set方法將一個新的查詢變量添加到查詢規(guī)范中,并將強制WordPress從webdev類別中檢索所有文章。這是結(jié)果查詢:
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE 1=1 AND ( wp_term_relationships.term_taxonomy_id IN (12) ) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10
在此示例中,LIMIT值已由管理員用戶在閱讀選項中設置,如下圖所示。
在自定義查詢中,由于分頁參數(shù), 我們可以設置posts_per_page要從數(shù)據(jù)庫中檢索的行數(shù)。
SQL_CALC_FOUND_ROWS選項強制查詢計算找到的行數(shù)。該數(shù)字將由SQL函數(shù)FOUND_ROWS()返回,如以下示例所示:
SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10; SELECT FOUND_ROWS();
不幸的是,SQL_CALC_FOUND_ROWS會顯著減慢查詢執(zhí)行時間。好消息是我們可以強制WordPress刪除提供未充分使用(且未記錄)no_found_rows變量的選項。
如果省略了SQL_CALC_FOUND_ROWS,則FOUND_ROWS()將返回最大值為LIMIT的行數(shù)(MySQL文檔中有關此主題的更多信息)。
在包含數(shù)百個文章的WordPress安裝中,以下元查詢耗時0.0107秒:
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) WHERE 1=1 AND ( ( wp_postmeta.meta_key = 'book_author' AND CAST(wp_postmeta.meta_value AS CHAR) LIKE '%Isaac Asimov%' ) ) AND wp_posts.post_type = 'book' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10
刪除SQL_CALC_FOUND_ROWS,設置no_found_rows為false,相同的查詢需要0.0006秒。
感謝Query Monitor插件,我們可以很容易地比較有和沒有SQL_CALC_FOUND_ROWS選項的兩個查詢
當wp_post表包含數(shù)千行時,查詢執(zhí)行可能需要幾秒鐘。當我們不需要分頁時,我們應該設置no_found_rows為true,使查詢運行得更快。
緩存或不緩存
WordPress提供了一個開箱即用的內(nèi)置緩存系統(tǒng)。雖然緩存通常會提高頁面加載速度,但它可能會導致對數(shù)據(jù)庫運行一些額外的查詢。此外,無論何時執(zhí)行查詢,都可能會請求一堆不必要的數(shù)據(jù)。
幸運的是,WordPress允許我們提供三個特定參數(shù)來禁用緩存:
- cache_results : 是否緩存文章信息。默認為true。
- update_post_meta_cache:是否更新文章meta緩存。默認為true。
- update_post_term_cache:是否更新文章term緩存。默認為true。
如果啟用了持久緩存系統(tǒng),例如Memcached,我們就不必關心緩存參數(shù),因為WordPress默認會將這些參數(shù)設置為false。
在任何其他情況下,我們可以使用以下代碼構(gòu)建更快的查詢:
function myplugin_pre_get_posts( $query ) {
if ( is_admin() || ! $query->is_main_query() ){
return;
}
$query->set( 'category_name', 'webdev' );
$query->set( 'no_found_rows', true );
$query->set( 'update_post_meta_cache', false );
$query->set( 'update_post_term_cache', false );
}
add_action( 'pre_get_posts', 'myplugin_pre_get_posts', 1 );
當永久緩存系統(tǒng)不可用時,不應緩存返回少量數(shù)據(jù)的查詢。
返回的字段
作為一般規(guī)則,我們永遠不應該在數(shù)據(jù)庫中查詢不必要的字段。WP_Query類提供的字段參數(shù),這允許限制返回字段的ID或 'id=>parent' 字段。源文件文檔定義fields參數(shù)如下:
要返回的字段。單個字段或所有字段(字符串),或字段數(shù)組。’id=>parent’ 使用 ‘id’ 和 ‘post_parent’。默認所有字段。接受“ids”、“id=>parent”。
fields變量允許'ids'和'id=>parent',并且默認為 *(任何其他值),盡管您會注意到默認情況下WordPress會在多個查詢中將該值設置為ids。最后,我們可以優(yōu)化我們的第一個查詢:
true,
'update_post_meta_cache' => false,
'update_post_term_cache' => false,
'category_name' => 'cms',
'fields' => 'ids'
);
// The Query
$the_query = new WP_Query( $args );
$my_posts = $the_query->get_posts();
if( ! empty( $my_posts ) ){
foreach ( $my_posts as $p ){
// Your code
}
}
/* Restore original Post Data */
wp_reset_postdata();
?>
當不需要特定字段時,將返回的字段限制為 ID。
小結(jié)
考慮到查詢速度對于幾百個帖子的小網(wǎng)站來說可能不會帶來巨大的優(yōu)勢。如果您想為增長做好準備,或者您正在運行一個包含昂貴查詢的大型網(wǎng)站,您應該優(yōu)化您的 WordPress 查詢。低效查詢會顯著減慢頁面加載速度,但通過一些簡單的調(diào)整,您可以大大加快您的網(wǎng)站速度。
網(wǎng)頁題目:使用WP_Query構(gòu)建高效的WordPress查詢
標題鏈接:http://m.fisionsoft.com.cn/article/djgdegh.html


咨詢
建站咨詢
