WordPress性能的瓶頸很多時(shí)候都在 MySQL數(shù)據(jù)庫(kù)查詢上,如果能把查詢數(shù)據(jù)緩存起來,對(duì)提高 WordPress 性能很有幫助,WordPress 為我們提供了 Transients API 供我們緩存數(shù)據(jù)。
根據(jù)服務(wù)器設(shè)置,Transients API 會(huì)把緩存數(shù)據(jù)存儲(chǔ)到不同的位置,如果服務(wù)器上有 Memcached 之類的對(duì)象緩存插件,緩存數(shù)據(jù)就直接存儲(chǔ)在內(nèi)存中,如果沒有緩存插件,緩存數(shù)據(jù)存儲(chǔ)在了 WordPress 的數(shù)據(jù)表中。
//檢查緩存是否已經(jīng)存在
if( false === ( $portfolio_query = get_transient( 'saved_product_query' ) ) ) {
//如果沒有緩存,進(jìn)行WordPress查
$portfolio_query = new WP_Query( array(
'post_type' => 'product',
'posts_per_page' => 10,
) );
set_transient( 'saved_product_query', $portfolio_query , 60*60*4 ); //設(shè)置緩存,時(shí)間為4個(gè)小時(shí)
}
//if( have_posts() ) { } ...在這里輸入查詢結(jié)果
//更新時(shí),刪除緩存
function wpc_delete_its_transients() {
global $post;
if( $post->post_type == 'portfolio' ) {
delete_transient( 'saved_product_query' );
}
}
add_action( 'save_post', 'wpc_delete_its_transients' );
以上代碼中,WordPress 會(huì)先查詢是否有緩存數(shù)據(jù),如果有緩存數(shù)據(jù),直接返回緩存的數(shù)據(jù),如果沒有,進(jìn)行MySQL查詢,設(shè)置緩存供下次使用,然后返回查詢到的數(shù)據(jù)。
在WordPress模板或插件中復(fù)雜查詢比較多的時(shí)候,Transients API 的效果是很明顯的。當(dāng)然,如果你使用的有類似 wp super cache 之類的插件,以上的代碼就是多余的了,因?yàn)?wp super cache,直接生成了靜態(tài)數(shù)據(jù),緩存效果比以上代碼是要好的。


