やあ。WordPressの深淵へようこそ。
多くの開発者がWordPressを「ただのブログツール」だと思っている間に、我々エンジニアは、その下で脈動するデータベースの鼓動と、クエリが走る瞬間のミリ秒単位の攻防に心血を注いでいる。
今日は、多くのエンジニアが躓く「タクソノミーの再帰的クエリ」という鬼門を、Redisを用いていかにして「一瞬」で終わらせるか。その極意を伝授しよう。
—
なぜ、タクソノミーの取得は「重い」のか?
WordPressのタクソノミー(カテゴリやカスタム分類)は、デフォルトでは `wp_term_taxonomy` テーブルに階層構造として保存されている。
もし、あなたが「親カテゴリから子、孫までを再帰的に取得してメニューを作りたい」と考えたとき、WordPressは毎回データベースに対して以下のような処理を行っているんだ。
1. SQLを発行して全タームを取得。
2. PHP側でループを回し、親子関係を照合してツリー構造を再構築する。
これが1000件のタームがあったらどうなる?
ページを表示するたびに、PHPのメモリを消費し、CPUを回し続けることになる。ユーザーは白い画面を見つめ、Googleのランキング評価は下がる。これが「技術的負債」の正体だ。
—
Redisによる「フラット化」という発想
ここでの解決策はシンプルだ。「再帰的な計算を、一度だけ行って結果をRedisに保存する(キャッシュする)」。
Redis(オブジェクトキャッシュ)を使うことで、DBへのSQL発行をゼロにし、メモリから直接データを引き抜く。これが、WordPressを「爆速」にするための鉄則だよ。
実装:Redisを活用したタクソノミー取得の極意
以下のコードは、タクソノミーの階層構造をJSONとしてRedisに保存し、次回からそれを再利用する仕組みだ。
/
- 高速化されたタクソノミー取得関数
/
function get_cached_taxonomy_tree($taxonomy = ‘category’) {
$cache_key = ‘my_taxonomy_tree_’ . $taxonomy;
// 1. まずRedis(オブジェクトキャッシュ)から探す
$tree = wp_cache_get($cache_key, ‘my_group’);
if (false === $tree) {
// 2. キャッシュがない場合のみ、重い処理を行う
$terms = get_terms([‘taxonomy’ => $taxonomy, ‘hide_empty’ => false]);
$tree = build_tree($terms); // 再帰的なツリー構築関数
// 3. 次回のためにRedisに保存(有効期限は24時間)
wp_cache_set($cache_key, $tree, ‘my_group’, DAY_IN_SECONDS);
}
return $tree;
}
// タームが更新されたらキャッシュを削除する(ここが重要!)
add_action(‘edited_term_taxonomy’, function() {
wp_cache_delete(‘my_taxonomy_tree_category’, ‘my_group’);
});
—
初学者が陥りやすい「3つの罠」
このコードを書くとき、多くの人が以下の場所でつまづく。君には同じ轍を踏んでほしくない。
1. キャッシュの「削除」を忘れる
「キャッシュをセットしたけど、タームを編集しても反映されない!」と悩むのはあるあるだ。WordPressには `edited_term_taxonomy` のようなフックがある。データが変わった瞬間にキャッシュを `wp_cache_delete` すること。これがデータ整合性の基本だ。
2. オブジェクトキャッシュの「グループ化」の欠如
`wp_cache_set($key, $data, $group)` の第3引数 `$group` を軽視してはいけない。グループを分けることで、特定のキャッシュだけをまとめて削除したり、デバッグ時に管理しやすくなるんだ。
3. シリアライズ可能なデータか確認する
Redisに保存するデータは、最終的に文字列としてシリアライズされる。もし `$tree` の中に `WP_Term` オブジェクトをそのまま突っ込むと、メモリの肥大化や予期せぬ挙動を招くことがある。JSONや配列として「純粋なデータ」にしてから保存するのが、プロの流儀だ。
—
まとめ:WordPressを支配するということ
「WordPressは遅い」と嘆くのは、エンジンを回す方法を知らないからに過ぎない。
- DBへの問い合わせを最小化する
- 計算結果は一度だけ行い、キャッシュに焼き付ける
- 更新フックを駆使して、鮮度を保つ
これらを意識するだけで、君の作るサイトは、世界中のどんな環境でも軽やかに動作するようになる。
WordPressは、奥が深い。だが、内部構造を掌握してしまえば、君はもう単なる「利用者」ではなく、システムの「設計者」だ。
今日のコードを、君のプロジェクトのfunctions.phpに組み込んでみてくれ。レスポンスタイムが劇的に改善されるその瞬間、きっとWordPressの本質が見えてくるはずだよ。
また分からないことがあれば、いつでも聞きに来るといい。頑張れよ!