通過使用Transients API緩存自定義查詢來加快WordPress的速度


哦,男孩,標題聽起來很嚇人,不是嗎。 您不必擔心,因為我們會分解所有內容。 您的主題是否正在運行自定義WordPress查詢,以在側邊欄或其他任何位置顯示隨機帖子,熱門帖子,近期帖子等? 如果是,那麼您應該考慮使用WordPress瞬態API來緩存這些查詢,以減少資源消耗並縮短加載時間。 在本文中,我們將向您展示如何通過使用Transients API緩存自定義查詢來加快WordPress網站的速度。

注意:您需要了解WordPress主題的工作方式(循環等),以便您閱讀本文。

因此,整個緩存和短暫的術語讓我感到頭疼。 好吧,別擔心,讓我們解釋一下它的作用。 基本上,如果您正在運行類似List25的網站,並且有一個循環在側邊欄中顯示6個隨機帖子,那麼臨時API可以提供幫助。 每次用戶刷新頁面時,您擁有的該自定義WP查詢將進入數據庫並隨機提取6個帖子。 如果您是一個相對較新的網站,那應該沒那麼糟。 但是,如果您有很多人訪問您的站點,則它可能會使您的SQL Server崩潰,並且您將看到“建立數據庫連接錯誤”屏幕。 通過添加一些額外的代碼行,您可以使用Transients API輕鬆地將查詢結果存儲(緩存)一定時間。

我們用於提取隨機帖子的循環代碼示例:

have_posts()) : $random_query->the_post();
?>
" title="">
" rel="bookmark">

邊欄中有關隨機帖子查詢的最酷的部分是每次都顯示新內容。 因此,通過將查詢緩存12小時,我們將有12個小時顯示相同的6個帖子,對嗎? 好吧,由於我們的朋友康斯坦丁·科夫申寧(@kovshenin)的建議,我們找到了工作。 他建議不要使用WP_Query,而要使用get_posts並提取20個帖子。 使用暫態API緩存該查詢的結果,然後使用array_rand()函數隨機顯示原始20條中的6條。 這樣,我們可以保持模擬站點上的隨機效果。

我們要做的第一件事是設置瞬態。 我們從WordPress Codex頁面獲得了代碼。

// Get any existing copy of our transient data
if ( false === ( $special_query_results = get_transient( 'special_query_results' ) ) ) {
    // It wasn't there, so regenerate the data and save the transient
	$randargs = array('orderby' => 'rand', 'numberposts' => 20);
	$special_query_results = get_posts($randargs);
    set_transient( 'special_query_results', $special_query_results, 60*60*12 );
}

注意60 * 60 * 12是您可以控制緩存長度的區域。 隨時將其更改為您喜歡的任何內容。 現在,如果我們使用foreach循環顯示$ special_query_results,我們將顯示所有20條帖子。 因此,我們需要利用array_rand()函數僅隨機提取6個項目。 我們添加瞭如下代碼:

$randomposts = get_transient( 'special_query_results' );
$randkey = array_rand( $randomposts, 6 );

現在,這將從我們的瞬態數據中隨機抽取6個帖子ID。 但是,它不會提取每個帖子的值。 因此,我們必須添加以下代碼:

$sixposts[0] = $randomposts[$randkey[0]];
$sixposts[1] = $randomposts[$randkey[1]];
$sixposts[2] = $randomposts[$randkey[2]];
$sixposts[3] = $randomposts[$randkey[3]];
$sixposts[4] = $randomposts[$randkey[4]];
$sixposts[5] = $randomposts[$randkey[5]];

基本上,我們為$ sixposts創建了一個數組,在其中為每個項目分配一個值。 不知道這是否是解決問題的最佳方法,但它確實有效。 如果您有更好的建議,請隨時在評論中發布。

完成之後,我們現在準備顯示循環。 只需將代碼如下所示:

global $post; //required for it to work
foreach( $sixposts as $post ) :  setup_postdata($post);

//All the items go here.

endforeach; 

setup_postdata允許您使用此foreach循環內的所有循環標籤,例如the_permalink等。

為了讓所有人都容易,這是我們擁有的最終代碼:

 'rand', 'numberposts' => 20);
	$special_query_results = get_posts($randargs);
    set_transient( 'special_query_results', $special_query_results, 60*60*12 );
}

// Use the data like you would have normally...
$randomposts = get_transient( 'special_query_results' );
$randkey = array_rand( $randomposts, 6 );
$sixposts[0] = $randomposts[$randkey[0]];
$sixposts[1] = $randomposts[$randkey[1]];
$sixposts[2] = $randomposts[$randkey[2]];
$sixposts[3] = $randomposts[$randkey[3]];
$sixposts[4] = $randomposts[$randkey[4]];
$sixposts[5] = $randomposts[$randkey[5]];

global $post;
foreach( $sixposts as $post ) :  setup_postdata($post); ?>

" title="">
" rel="bookmark">

達達,現在無論有多少用戶訪問您的網站,您只需要每12小時進行一次數據庫查詢。