こんにちは!WordPressの広大な宇宙へようこそ。
普段は大規模システムのコアコードを書き換えたり、データベースの数ミリ秒の遅延を削ったりしているエンジニアですが、今日は皆さんに「WordPressの本当の姿」を教えにきました。
プログラミングを始めたばかりの方や、他の言語からWordPressの世界に飛び込んできた方にとって、WordPressのデータベースは「なんだかよくわからないブラックボックス」に見えるかもしれません。でも、その中身を少しだけ賢く使うだけで、サイトのスピードは劇的に変わります。
今日は、多くの開発者が素通りしてしまう「wp_postsテーブルの隠された宝物」を使って、検索機能を爆速にする魔法のようなテクニックを伝授しますね。
—
1. データベースの裏側に眠る「謎のカラム」を見つけよう
WordPressで記事を保存すると、`wp_posts` というテーブルにデータが格納されます。ここにはタイトルや本文が入っているのですが、その中に「post_content_filtered」という名前のカラムがあるのをご存知ですか?
実を言うと、このカラム、現在の標準的なWordPressではほとんど使われていません。いわば「空き部屋」のような状態です。
なぜこの「空き部屋」が重要なの?
通常の検索(`s=キーワード`)では、WordPressは `post_content`(本文)の中を一生懸命探します。しかし、本文にはHTMLタグやショートコードがたくさん含まれていますよね。
- `
` や `` といった文字列まで検索対象になってしまう。
- データ量が多いと、検索のたびにサーバーに大きな負荷がかかる。
そこで、「あらかじめ検索されやすい綺麗なテキストだけを `post_content_filtered` に作っておく」という戦略をとるのです。
—
2. 実践:検索専用の「綺麗なデータ」を自動で作る
それでは、記事を保存する瞬間に、HTMLタグを取り除いた純粋なテキストをこのカラムにコピーする仕組みを作ってみましょう。
以下のコードを、テーマの `functions.php` に貼り付けてみてください。
/
- 記事を保存する直前に、検索用のクリーンなデータを生成する
/
add_filter(‘wp_insert_post_data’, ‘my_optimize_search_data’, 10, 2);function my_optimize_search_data($data, $postarr) {
// 1. 自動保存やリビジョンの場合は何もしない(負荷軽減)
if (defined(‘DOING_AUTOSAVE’) && DOING_AUTOSAVE) return $data;
if ($data[‘post_status’] === ‘inherit’) return $data;// 2. 本文(post_content)からHTMLタグとショートコードを取り除く
// これが「前処理(Pre-processing)」です
$clean_content = strip_shortcodes($data[‘post_content’]); // ショートコード削除
$clean_content = strip_tags($clean_content); // HTMLタグ削除
$clean_content = trim($clean_content); // 前後の空白削除// 3. 隠されたカラム ‘post_content_filtered’ に保存!
$data[‘post_content_filtered’] = $clean_content;return $data;
}ここがポイント!
- `wp_insert_post_data` フック: データベースに書き込まれる「直前」にデータを加工できる、非常に強力なフックです。
- `strip_tags`: `
こんにちは
` を `こんにちは` だけにしてくれます。検索エンジンが読みやすい形にするのがコツです。
—
3. なぜこれが「パフォーマンス最適化」になるのか?
「データを2箇所に持つなんて、無駄じゃない?」と思うかもしれません。しかし、ここには高度なエンジニアリングの考え方が隠れています。
検索エンジン(Elasticsearch等)との連携
将来的にサイトが巨大になり、外部の高速検索エンジン(ElasticsearchやAlgoliaなど)を使いたくなった時、この `post_content_filtered` カラムが真価を発揮します。
1. 同期の効率化: 外部エンジンにデータを送る際、重たいHTMLを解析する必要がありません。このカラムを送るだけで済みます。
2. 検索精度の向上: ノイズ(HTMLタグ)がないため、本当に探したい言葉がヒットしやすくなります。
3. DB負荷の分散: 標準の `post_content` への `LIKE` 検索を避け、このカラム専用のインデックスを貼ることで、DBの読み取り速度を跳ね上げることができます。—
4. 初心者が陥りやすい「文法エラー」と「注意点」
このカスタマイズに挑戦する際、いくつか気をつけてほしいことがあります。
① セミコロン(;)の忘れ物
PHPでは、命令の終わりに必ず `;` が必要です。
$data[‘post_content_filtered’] = $clean_content // ← ここでエラー!
return $data;「画面が真っ白になった!」という時は、まずセミコロンを確認してくださいね。
② 既存の記事には適用されない
上のコードは「これから保存する記事」にしか動きません。過去の記事も綺麗にしたい場合は、一度「一括更新」するか、専用のスクリプトを走らせる必要があります。
③ フックの優先順位
他のプラグインが本文を書き換えている場合、`10` という数字を `99` などに大きくして、一番最後に実行されるように調整することがあります。
`add_filter(‘wp_insert_post_data’, ‘my_optimize_search_data’, 99, 2);`—
まとめ:WordPressを「掌握」する第一歩
「ただブログを書くツール」としてWordPressを見るのではなく、「どうすればデータベースを最も効率よく動かせるか?」という視点を持つこと。それが、初心者からプロフェッショナルへ脱皮するための境界線です。
今回紹介した `post_content_filtered` の活用は、まさにその第一歩。
標準の機能をあえて別の目的で使いこなし、システム全体の負荷を下げる。この「設計の美学」が分かれば、WordPressのカスタマイズはもっと楽しくなりますよ。ここをクリアすれば、WordPressの基本(そして応用への道)はバッチリマスターできます。
もし分からないことがあれば、いつでもコードの宇宙にいる私に聞いてくださいね。応援しています!