ツイート
シェア
LINEで送る
B! はてぶでブックマーク
Pocketでブックマーク
RSSフィード

WordPress5.3, DBクエリログをカスタマイズする

wordpress image
イラストダウンロードサイト【イラストAC】
の画像をもとに加工しています。

WordPressは頻繁にDBアクセスをするのですが、そのクエリログ機能が元々あります。

WP5.3から、そのログにカスタム情報を追加できるようになりました。

かんたんです。多くても10行程度でできます。WPではおなじみのフィルター・フックを使って。

開発者向けの話です。テーマ・プラグインを作っている人は要チェック。

デバッグモードで動かす

カスタマイズするログはデバッグモードでないと出力されません。

デバッグモードでも、DBクエリーログをONにしないと出力されません。

設定はwp-config.phpで行います。

(定数 SAVEQUERIES をtrueにする。)

wp-config.php
// WP_DEBUGモードのon/off
define('WP_DEBUG', true);

if (WP_DEBUG) {
    // クエリーログ $wpdb->queriesに保存
    define( 'SAVEQUERIES', true );
}

if文を外してしまえばデバッグモードでなくても出力されますが、これは絶対にやってはいけません

クエリーログは処理の負荷が高いです。間違いなくサイトのパフォーマンスに影響します。

(WordPressドキュメントでもそう言っている。)

とくに、本番環境では絶対に使わないようにしましょう。

ログの出力先

ログの出力先はWordPressのDBオブジェクトです。

global $wpdb;
$query_log = $wpdb->queries;
echo var_export( $query_log, true );

これをテーマのテンプレートなど、DBクエリ実行後に処理するところに入れてください。

array (
・
・
省略
・
・
  69 => 
  array (
    0 => 'SELECT option_value FROM wp_options WHERE option_name = \'has_jetpack_search_product\' LIMIT 1',
    1 => 0.00033092498779296875,
    2 => 'require(\'wp-blog-header.php\'), require_once(\'wp-load.php\'), require_once(\'/home/test/web/wp-config.php\'), require_once(\'wp-settings.php\'), do_action(\'init\'), WP_Hook->do_action, WP_Hook->apply_filters, wp_widgets_init, do_action(\'widgets_init\'), WP_Hook->do_action, WP_Hook->apply_filters, jetpack_search_widget_init, Jetpack_Plan::supports, get_option',
    3 => 1589095210.381156,
    4 => 
    array (
    ),
  ),
・
・
省略
・
・
)

ログにはWordPress本体、プラグイン、テーマが実行するすべてのクエリが配列で保存されます。

配列
要素
内容
0SQL
1タイムスタンプ。
SQL実行時間。
2CallStack
SQLを実行した場所。
3タイムスタンプ。
SQL実行開始時刻。
4補足情報。

(今回のカスタマイズで追加するところは最後の補足情報のところ。)

カスタマイズの方法

カスタマイズの方法はWordPressでおなじみのフックです。WP5.3で新しく追加されました。

add_filter( 'log_query_custom_data', function($query_data, $query, $query_time, $query_callstack, $query_start) {

    // 使っているテーマが実行したSQLだけに補足情報追加。
    $theme = '/themes/my-theme';
    if ( strstr( $query_callstack, $theme ) ) {

        // 日時を整形
        $timestamp = floor($query_start);
        $msec = floor(( $query_start - $timestamp ) * 10000000);

        $query_data['my-theme'] = [
            'description' => 'my theme query info',
            'query time' => round($query_time, 6) . ' [sec]',
            'query start' => wp_date('Y/m/d H:i:s.', $timestamp) . $msec,
        ];
    }
    return $query_data;
}, 10, 5 );

パラメータでクエリログのすべてのデータが渡されます。すでに見えてるものを渡されてもいらないと思わなくもないですが。

せいぜいSQL実行時間・開始時間の整形ぐらいでしょうか?

あとは、テーマやプラグインなどで補足情報の出力に制限をかけるくらいです。

(テーマやプラグインが実行しているSQLがひと目で分かる。)

array (
  0 => 
  array (
    0 => 'SELECT  wp_blogs.blog_id FROM wp_blogs  WHERE domain = \'tadtadya.test\' AND path = \'/\'  ORDER BY wp_blogs.blog_id ASC LIMIT 1',
    1 => 0.00048804283142089844,
    2 => 'require(\'wp-blog-header.php\'), require_once(\'wp-load.php\'), require_once(\'/home/test/web/wp-config.php\'), require_once(\'wp-settings.php\'), require(\'wp-includes/ms-settings.php\'), ms_load_current_site_and_network, get_site_by_path, get_sites, WP_Site_Query->query, WP_Site_Query->get_sites, WP_Site_Query->get_site_ids',
    3 => 1589095210.230706,
    4 => 
    array (
    ),
  ),
・
・
省略
・
・
  98 => 
  array (
    0 => 'SHOW TABLES LIKE \'wp_wpgdprc_consents\'',
    1 => 0.00065302848815917969,
    2 => 'require(\'wp-blog-header.php\'), require_once(\'wp-includes/template-loader.php\'), include(\'/themes/my-theme/index.php\'), get_header, locate_template, load_template, require_once(\'/themes/my-theme/header.php\'), wp_head, do_action(\'wp_head\'), WP_Hook->do_action, WP_Hook->apply_filters, wp_enqueue_scripts, do_action(\'wp_enqueue_scripts\'), WP_Hook->do_action, WP_Hook->apply_filters, WPGDPRC\\WPGDPRC->loadAssets, WPGDPRC\\Includes\\Consent::isActive, WPGDPRC\\Includes\\Consent::databaseTableExists',
    3 => 1589108907.4209421,
    4 => 
    array (
      'my-theme' => 
      array (
        'description' => 'my theme query info',
        'query time' => '0.000653 [sec]',
        'query start' => '2020/05/10 20:08:27.4209420',
      ),
    ),
  ),・
・
・
省略
・
・
  411 => 
  array (
    0 => 'SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (9161) ORDER BY meta_id ASC',
    1 => 0.00010609626770019531,
    2 => 'require(\'wp-blog-header.php\'), require_once(\'wp-includes/template-loader.php\'), include(\'/themes/my-theme/index.php\'), get_footer, locate_template, load_template, require_once(\'/themes/my-theme/footer.php\'), dynamic_sidebar, WP_Widget->display_callback, PHP_Code_Widget->widget, eval, get_the_post_thumbnail, wp_get_attachment_image, wp_get_attachment_image_srcku, image_downsize, wp_attachment_is_image, wp_attachment_is, get_attached_file, get_post_meta, get_metadata, update_meta_cache',
    3 => 1589108907.8454399,
    4 => 
    array (
      'my-theme' => 
      array (
        'description' => 'my theme query info',
        'query time' => '0.000106 [sec]',
        'query start' => '2020/05/10 20:08:27.8454399',
      ),
    ),
  ),
)
前の投稿
WordPress5.3, script, styleタグのtype属性を消す方法
WordPress5.3, マイナーアップデート(WP5.3.x)の内容
次の投稿

WordPressの本

post-cta-image

たくさんあるなかで、WordPressの基本が学べる、目的別に学べる本を選びました。

  • WordPressの基本。
  • Webサイト作成から運用まで全体的に学ぶ。
  • かんたんなカスタマイズを学ぶ。
  • 何も分からないところから学ぶ。
  • WordPressからPHPプログラミングを学ぶ。

の5冊です。どうしてもネット上で調べて勉強するのが苦手という人におすすめです。

この内容をモノにすればほかの本は必要ありません。あとは自分の力で、書籍を使わずにインターネット上にある情報だけで学んでいけます。

コメントを残す

*