WordPressが発行したSQLの履歴を確認する方法
コードを1行追加するだけでWordPressが自動発行しているSQLの履歴を確認する方法を紹介します。
いつ使うのか
WordPressのマルチサイト機能を使ったブログで、全ブログの投稿データをカスタムタクソノミーで絞り込んで関連情報として表示したかったので、SQLを指定するヒントを得るために使いました。
順を追って話しますね。
最近、WordPressのマルチサイト機能を使って、複数のブログを管理するためのシステムを作っています。
その案件に「TOPページに全ブログの投稿を表示する」という仕様があり、そのために必要な「複数のテーブルから投稿データを引っ張ってくる」はできましたが、
それを更に発展させてカスタムタクソノミーで絞り込みをする仕様をどうやって実装すればいいのかわからず途方に暮れました。
なぜなら、「投稿データが入っているwp_postsテーブル」にカスタムタクソノミーの情報が入っていないからです。
そんなとき、普段使ってる WP_Query() が投稿をカスタムタクソノミーで絞り込んでるじゃん!ということを思い出し、このクラスがどういうSQLで投稿データを取得してるのかを確認してみました。
具体的な手順
本題のWordPressが発行したSQLの履歴の確認ですが、ある程度具体的なデータが見たいので、ローカル環境にあった別のWordPressサイトでテストしてみました。
手順は2つのファイルに1行のコードを追加するだけです。
wp-config.php
// SQLの履歴を表示する ###この一文はあとで削除して下さい
define( 'SAVEQUERIES', true );
履歴を表示したいページ
global $wpdb; echo '<pre style="white-space: pre-wrap;">'; print_r($wpdb->queries); echo '</pre>';
解説
$wpdbというのはMySQLに接続してクエリの発行や取得、値のエスケープをやってくれる気の利いたクラスで、$wpdb->queries 内に目的のSQLと実行時間、呼び出し元の関数が保存されています。
wp-config.php で SAVEQUERIES をオンにすることでこれを有効にします。
大量のSQLが表示される
さて、$wpdb->queries をページ上に表示したのですが、大量に表示されたSQLの中から使えそうなのを探さなくてはなりません。
今回はカスタムタクソノミーで絞りこんでいるので、カスタムタクソノミーのスラッグ名やidで検索すると良いでしょう。
まとめ
SQLを研究した結果、どうやら「投稿データが入っているwp_posts」と「投稿に紐付いたカテゴリやタグの情報が入ったwp_term_relationships」を結合させていることがわかり、そこからはトントン拍子で実装に漕ぎ着けました。
やはりプログラムの問題解決はデバッグでしか得られないことを再確認した1日でした。