日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
使用WP_Query構(gòu)建高效的WordPress查詢

成都做網(wǎng)站、成都網(wǎng)站制作過(guò)程中,需要針對(duì)客戶的行業(yè)特點(diǎn)、產(chǎn)品特性、目標(biāo)受眾和市場(chǎng)情況進(jìn)行定位分析,以確定網(wǎng)站的風(fēng)格、色彩、版式、交互等方面的設(shè)計(jì)方向。成都創(chuàng)新互聯(lián)還需要根據(jù)客戶的需求進(jìn)行功能模塊的開(kāi)發(fā)和設(shè)計(jì),包括內(nèi)容管理、前臺(tái)展示、用戶權(quán)限管理、數(shù)據(jù)統(tǒng)計(jì)和安全保護(hù)等功能。

作為wordpress開(kāi)發(fā)人員,我們經(jīng)常需要從WordPress數(shù)據(jù)庫(kù)中檢索符合特定條件的文章、頁(yè)面和其他內(nèi)容。通常,我們不需要構(gòu)建SQL查詢(通常我們不應(yīng)該),因?yàn)?code>WP_Query類及其方法為我們提供了一種從數(shù)據(jù)庫(kù)中檢索數(shù)據(jù)的安全有效的方法。我們只需要聲明一個(gè)參數(shù)數(shù)組,$query對(duì)象就會(huì)構(gòu)建實(shí)際的SQL查詢。

在這篇文章中,我將假設(shè)您已經(jīng)了解WP_Query類的基礎(chǔ)知識(shí)、它的方法和屬性,以及在哪里可以找到可用變量的列表。

我們將重點(diǎn)介紹WP_Query類提供的參數(shù),專門(mén)用于優(yōu)化SQL查詢,減少執(zhí)行時(shí)間和資源消耗。

當(dāng)流量和內(nèi)容有限時(shí),我們通常不會(huì)關(guān)心查詢的效率。WordPress構(gòu)建了優(yōu)化良好的SQL查詢,并提供了一個(gè)開(kāi)箱即用的緩存系統(tǒng)。

當(dāng)流量和網(wǎng)站內(nèi)容顯著增長(zhǎng)時(shí)——多達(dá)數(shù)千個(gè)文章——那么我們必須考慮查詢執(zhí)行時(shí)間。

  • 我們的工具箱
  • WP_Query – 為什么我們不計(jì)算行數(shù)
  • 緩存或不緩存
  • 返回的字段

我們的工具箱

我將向您展示的代碼已經(jīng)通過(guò)Query Monitor測(cè)試,這是一個(gè)免費(fèi)插件,提供有關(guān)查詢性能、觸發(fā)掛鉤、HTTP請(qǐng)求、重寫(xiě)規(guī)則等的基本信息。

作為插件的替代方案,我們可以強(qiáng)制WordPress存儲(chǔ)查詢信息,在wp-config.php中聲明以下常量:

define( 'SAVEQUERIES', true );

當(dāng)SAVEQUERIES設(shè)置為true時(shí),WordPress會(huì)在$wpdb->queries數(shù)組中注冊(cè)查詢和一堆有用的信息。因此,調(diào)用者函數(shù)的名稱和每個(gè)查詢的執(zhí)行間隔可以通過(guò)在像footer.php這樣的模板文件中添加以下代碼來(lái)打?。?/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
)

如果您想深入研究這個(gè)主題,請(qǐng)查看我們的教程: 編輯wp-config.php。最后,考慮到插件和內(nèi)置SAVEQUERIES功能都是開(kāi)發(fā)工具,我們應(yīng)該在生產(chǎn)環(huán)境中關(guān)閉它們。

話雖如此,讓我們來(lái)看看如何加速WordPress查詢。

WP_Query – 為什么我們不計(jì)算行數(shù)

我們可以使用get_posts函數(shù)查詢數(shù)據(jù)庫(kù),該函數(shù)返回一個(gè)文章數(shù)組或一個(gè)新的WP_Query對(duì)象實(shí)例。在這兩種情況下,我們都可以通過(guò)為特定變量設(shè)置適當(dāng)?shù)闹祦?lái)確定查詢的結(jié)果。

讓我們從一個(gè)示例開(kāi)始,該示例顯示了通常出現(xiàn)在模板文件中的常見(jià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是一個(gè)鍵/值對(duì)數(shù)組。這些對(duì)被命名為查詢變量,并決定或影響實(shí)際的SQL查詢。從插件查詢數(shù)據(jù)庫(kù)時(shí),我們可能更喜歡使用pre_get_posts過(guò)濾器,如下例所示:

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 );

這里要注意的重要一點(diǎn)是$query對(duì)象是通過(guò)引用傳遞的,而不是通過(guò)值傳遞,這意味著查詢參數(shù)只是影響現(xiàn)有$query實(shí)例。

set方法將一個(gè)新的查詢變量添加到查詢規(guī)范中,并將強(qiáng)制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值已由管理員用戶在閱讀選項(xiàng)中設(shè)置,如下圖所示。

在自定義查詢中,由于分頁(yè)參數(shù), 我們可以設(shè)置posts_per_page要從數(shù)據(jù)庫(kù)中檢索的行數(shù)。

SQL_CALC_FOUND_ROWS選項(xiàng)強(qiáng)制查詢計(jì)算找到的行數(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會(huì)顯著減慢查詢執(zhí)行時(shí)間。好消息是我們可以強(qiáng)制WordPress刪除提供未充分使用(且未記錄)no_found_rows變量的選項(xiàng)。

如果省略了SQL_CALC_FOUND_ROWS,則FOUND_ROWS()將返回最大值為LIMIT的行數(shù)(MySQL文檔中有關(guān)此主題的更多信息)。

在包含數(shù)百個(gè)文章的WordPress安裝中,以下元查詢耗時(shí)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,設(shè)置no_found_rows為false,相同的查詢需要0.0006秒。

感謝Query Monitor插件,我們可以很容易地比較有和沒(méi)有SQL_CALC_FOUND_ROWS選項(xiàng)的兩個(gè)查詢

當(dāng)wp_post表包含數(shù)千行時(shí),查詢執(zhí)行可能需要幾秒鐘。當(dāng)我們不需要分頁(yè)時(shí),我們應(yīng)該設(shè)置no_found_rowstrue,使查詢運(yùn)行得更快。

緩存或不緩存

WordPress提供了一個(gè)開(kāi)箱即用的內(nèi)置緩存系統(tǒng)。雖然緩存通常會(huì)提高頁(yè)面加載速度,但它可能會(huì)導(dǎo)致對(duì)數(shù)據(jù)庫(kù)運(yùn)行一些額外的查詢。此外,無(wú)論何時(shí)執(zhí)行查詢,都可能會(huì)請(qǐng)求一堆不必要的數(shù)據(jù)。

幸運(yùn)的是,WordPress允許我們提供三個(gè)特定參數(shù)來(lái)禁用緩存:

  • cache_results : 是否緩存文章信息。默認(rèn)為true。
  • update_post_meta_cache:是否更新文章meta緩存。默認(rèn)為true。
  • update_post_term_cache:是否更新文章term緩存。默認(rèn)為true。

如果啟用了持久緩存系統(tǒng),例如Memcached,我們就不必關(guān)心緩存參數(shù),因?yàn)閃ordPress默認(rèn)會(huì)將這些參數(shù)設(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 );

當(dāng)永久緩存系統(tǒng)不可用時(shí),不應(yīng)緩存返回少量數(shù)據(jù)的查詢。

返回的字段

作為一般規(guī)則,我們永遠(yuǎn)不應(yīng)該在數(shù)據(jù)庫(kù)中查詢不必要的字段。WP_Query類提供的字段參數(shù),這允許限制返回字段的ID或 'id=>parent' 字段。源文件文檔定義fields參數(shù)如下:

要返回的字段。單個(gè)字段或所有字段(字符串),或字段數(shù)組?!痠d=>parent’ 使用 ‘id’ 和 ‘post_parent’。默認(rèn)所有字段。接受“ids”、“id=>parent”。

fields變量允許'ids''id=>parent',并且默認(rèn)為 *(任何其他值),盡管您會(huì)注意到默認(rèn)情況下WordPress會(huì)在多個(gè)查詢中將該值設(shè)置為ids。最后,我們可以優(yōu)化我們的第一個(gè)查詢:

 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();
?>

當(dāng)不需要特定字段時(shí),將返回的字段限制為 ID。

小結(jié)

考慮到查詢速度對(duì)于幾百個(gè)帖子的小網(wǎng)站來(lái)說(shuō)可能不會(huì)帶來(lái)巨大的優(yōu)勢(shì)。如果您想為增長(zhǎng)做好準(zhǔn)備,或者您正在運(yùn)行一個(gè)包含昂貴查詢的大型網(wǎng)站,您應(yīng)該優(yōu)化您的 WordPress 查詢。低效查詢會(huì)顯著減慢頁(yè)面加載速度,但通過(guò)一些簡(jiǎn)單的調(diào)整,您可以大大加快您的網(wǎng)站速度。


文章名稱:使用WP_Query構(gòu)建高效的WordPress查詢
標(biāo)題URL:http://www.dlmjj.cn/article/djgdegh.html