WordPressは頻繁にDBアクセスをするのですが、そのクエリログ機能が元々あります。
WP5.3から、そのログにカスタム情報を追加できるようになりました。
かんたんです。多くても10行程度でできます。WPではおなじみのフィルター・フックを使って。
開発者向けの話です。テーマ・プラグインを作っている人は要チェック。
デバッグモードで動かす
カスタマイズするログはデバッグモードでないと出力されません。
デバッグモードでも、DBクエリーログをONにしないと出力されません。
設定はwp-config.phpで行います。
(定数 SAVEQUERIES をtrueにする。)
// 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本体、プラグイン、テーマが実行するすべてのクエリが配列で保存されます。
配列 要素 | 内容 |
---|---|
0 | SQL |
1 | タイムスタンプ。 SQL実行時間。 |
2 | CallStack 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',
),
),
),
)