こんにちは!WordPressの裏側の仕組みや、データベースがどう動いているのか気になってこのページに辿り着いたのですね。素晴らしい着眼点です!
他のプログラミング言語や一般的なWebフレームワークからWordPressに入った開発者の多くが、「なんだかサイトの表示が重いな……」と直面したとき、最初に迷子になりがちです。
でも大丈夫ですよ。ここをクリアすれば、WordPressのデータベース周りの基本はバッチリマスターできますからね。
今回は、WordPressの心臓部である `WP_Query` が裏側でどんなSQLを発行しているのかを丸裸にし、重いクエリを特定するための最初の一歩を、優しく紐解いていきましょう。
—
なぜ、あなたのWordPressは重くなるのか?
WordPressでサイトを作っていると、記事一覧やカスタム投稿を表示するために `new WP_Query()` や `query_posts()`、あるいはメインクエリといった形でデータベースにアクセスしますよね。
初心者の方がやりがちなのが、「とりあえず必要なデータを取得するコードを書いたけれど、裏側でどれくらいデータベースに負荷がかかっているか気付いていない」という状態です。
実は、WordPressは非常にリッチな機能を持っている反面、何気なく書いた1回の `WP_Query` が、裏側で複雑なSQL(JOINや子クエリなど)を大量に生み出していることがあります。
「目に見えないSQL」を可視化すること。それがパフォーマンスチューニングのすべての始まりなんです。
—
魔法の定数 `SAVEQUERIES` でSQLを覗き見する
WordPressには、開発者向けにデータベースへのクエリ(問い合わせ)をすべて記録しておいてくれる、とっておきのデバッグ機能が用意されています。
それが、定数 `SAVEQUERIES` です。
これを使うために、まずは設定ファイルである `wp-config.php` を覗いてみましょう。
1. `wp-config.php` でクエリの記録を有効化する
`wp-config.php` の中にある `/ 編集が必要なのはここまでです… /` という行よりも上の位置に、以下のコードを1行追加してください。
/
- データベースクエリの記録を有効化 (デバッグ用)
- 本番環境ではパフォーマンス低下の原因になるため、必ずfalseにするか削除してください。
/
define( ‘SAVEQUERIES’, true );
これだけで、WordPressはこれ以降に実行されたすべてのSQL文、その実行にかかった時間(秒数)、そして「どの関数のどの行から呼ばれたか(コールスタック)」をメモリ上に保存し始めます。
—
実際に発行されたクエリを出力して確認してみよう
記録ができるようになったら、次はそれを画面に出力して確認してみましょう。
例えば、テーマの `footer.php` や、検証用のカスタムページテンプレートなどに、以下のコードを貼り付けてみてください。
‘;
echo ‘
— WP_Query & Database Debug Inspector —
‘;
echo ‘
総クエリ数: ‘ . count( $wpdb->queries ) . ‘
‘;
// 実行されたクエリの配列をループして中身を確認
foreach ( $wpdb->queries as $index => $query ) {
$sql_statement = $query[0]; // 実行されたSQL文
$execution_time = $query[1]; // 実行時間(秒)
$call_stack = $query[2]; // どこから呼ばれたか
echo ‘
‘;
echo ‘[‘ . ( $index + 1 ) . ‘] 実行時間: ‘ . round( $execution_time 1000, 2 ) . ‘ ms
‘;
echo ‘
' . esc_html( $sql_statement ) . '‘;
echo ‘呼び出し元: ‘ . esc_html( $call_stack ) . ‘‘;
}
echo ‘