【入門編】wp_postsのpost_content_filteredカラムを活用した検索負荷の分散と全文検索エンジンとの連携 – WordPress 内部コア・データベース構造とパフォーマンス最適化解析バイブル

こんにちは!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の基本(そして応用への道)はバッチリマスターできます。
もし分からないことがあれば、いつでもコードの宇宙にいる私に聞いてくださいね。応援しています!

タイトルとURLをコピーしました