重いクエリをなんとかしたい!WordPressでキャッシュを生成して高速化させる方法

カスタム

WordPressではテーマテンプレートを自由に作成することができますが、表現したいものによっては
負荷の高いクエリを何度も呼び出す必要があるケースも生まれます。
もし負荷の高いクエリが同じ内容であるならば、キャッシュを使って高速化させることをおすすめします。

今回はWordPressでキャッシュを使用する方法を紹介します。

wp_cache関数とは

WordPressには「WP_Object_Cache」というキャッシュを管理するためのクラスがすでに備わっています。このクラスを利用する場合は基本的に wp_cache関数 を使います。

wp_cache関数は特別なプラグインを使用しない状態ではページをまたいでキャッシュを使用することができません。
あくまで1アクセス内での処理をキャッシュしたい場合に利用するものです。(バージョン2.5以前ではwp-config.phpでキャッシュ期限を永続的にする方法がありましたが、現在は廃止されています。)

wp_cache関数を使ってキャッシュを管理する

wp_cache関数の一覧です。キャッシュを識別するためのキーと、キャッシュさせたい値を渡すだけの
シンプルなものです。

wp_cache関数の引数はほとんどのものが以下の内容です。

 
wp_cache_***($key, $data, $group);

$key: キャッシュキー
$data: キャッシュに保存したいデータ
$group: (任意)グループ名を指定(複数のグループで同じキーを利用できます)

wp_cache関数一覧

wp_cache_add( $key, $data, $group ) 渡されたキャッシュキーが存在しない場合キャッシュを生成します。存在する場合FALSEを返します。
wp_cache_set( $key, $data, $group ) キャッシュを生成します。wp_cache_add()とは違い、渡されたキャッシュキーが存在する場合は上書き、存在しない場合は生成します。
※ 生成時に特別な処理が必要ない場合はキャッシュを生成する際にはこの関数を利用すると便利です。
wp_cache_get( $key, $group ) 指定されたキーで保存されたキャッシュのデータを取得します。存在しない場合はFALSEを返します。
wp_cache_delete( $key, $group ) 指定されたキーのキャッシュをクリアします。
wp_cache_replace( $key, $data, $group ) 指定されたキーのキャッシュが存在する場合、渡された値で入れ替えます。wp_cache_set()とは違い、キーが存在しない場合は何もしません。
wp_cache_flush() 全てのキャッシュデータをクリアします。

負荷の高いクエリ内容をキャッシュさせる

キャッシュの使用例です。主に負荷の高いクエリを何度も呼び出す必要があるケース、または複数のテンプレートファイル内で使用する必要があるケースでキャッシュを使用します。
下の例ではキャッシュキー "navi_contents" としてキャッシュにクエリ結果を保存しています。
キャッシュが存在する場合はキャッシュから取得しているので、何度もDBを叩く必要がなくなります。

<?php

// キャッシュを取得する
$navi_res = wp_cache_get('navi_contents');

// キャッシュが存在しない
if ( $navi_res === FALSE )
{
	// DBを叩いて結果を取得
	$args = [
		// 負荷の高い内容
	];
	$navi_res = new WP_Query($args);
	
	// DBから受け取ったデータをキャッシュに保存する
	wp_cache_set('navi_contents', $navi_res);
}

?>

$navi_res を取得したい場合は上のコードを使用することでDBを叩く回数を1回のみに絞ることができます。
キャッシュをクリアしたい場合はこちら。

<?php

// キャッシュをクリア
wp_cache_delete('navi_contents');

?>

シンプルです。

複数のページに渡ってキャッシュを保持させたい!

wp_cache関数はそのまま使うと1つのアクセス内でのみ有効です。
他のページでも保持させたままにしたい場合は永続的キャッシュプラグインを使用する必要があります。

WP File Cache オブジェクトキャッシュをデータベースの読み出しからディスク/ファイルシステムに移行しています。
File-Based Caching for WordPress WordPress2.1 - 2.3に見られたファイルベースのオブジェクトキャッシュ機構を再実装しています。
Memcached Object Cache WordPressに対して永続的オブジェクトキャッシュのバックエンドを提供します。memcachedサーバーとPECLのmemcached拡張が必要です。

また、「Transients API」を使ってDBキャッシュを活用する方法もあります。こちらもWordPressには標準で搭載されています。
こちらは有効期限を指定することができるので、期限付きでキャッシュをさせたい場合におすすめです。

カスタム

関連記事