WordPressの管理画面を表示しているだけで繰り返しサーバ側にリクエストが行われている
ブラウザからheartbeat APIへ断続的にリクエストするjsの存在
WordPressにはheartbeatというブラウザのjavascriptからリクエスト受けるためのAPIがあります。
バージョン3.6から追加されたAPIで、この機能により記事編集中に定期的に書いている途中の文章をサーバ側に保存したりするために非同期でリクエストが行われています。
ブラウザからheartbeat APIへのリクエストは、記事作成画面だけでなく、ダッシュボードなどからも行われているため管理画面のページを表示したままにしておくと下の画像のようにheartbeat APIへのリクエストが繰り返し行われることになります。
上の画像はfirefoxのjsインスペクタでコンソールを開いた状態になりますが、
/wp-admin/admin-ajax.php
というWordPressのAjaxインタフェースに繰り返しリクエストが行われていることが確認できます。
heartbeat APIへリクエストさせない方法
heartbeat APIへのリクエストはブラウザ側からjavascriptで自動的に行われるようになっています。そのため、そのjavascriptの読み込みを解除することでheartbeat APIへのリクエストを制御することができます。純粋に解除するには以下のようにします。
function no_heartbeat() { wp_deregister_script('heartbeat'); } add_action( 'admin_enqueue_scripts', 'no_heartbeat' );
heartbeatのスクリプト読み込みを解除するアクションフックが上のコードになります。テーマの関数(functions.php)に追加することでheartbeatのjavascriptを解除することが可能です。
上のコードは、WordPressの管理画面全体に作用しますので、新規記事作成時の自動保存も無効になります。記事の自動保存だけを有効にする場合は下のコードで制御することができます。
function post_new_heartbeat() { global $pagenow; if ( 'post-new.php' != $pagenow ) { wp_deregister_script('heartbeat'); } } add_action( 'admin_enqueue_scripts', 'post_new_heartbeat' );
新規記事作成ページである
post-new.php
以外のページでは、heartbeatのjs読み込みを無効にするコードが上のコードです。
heartbeat APIのリクエスト間隔を調整
リクエスト間隔をある程度調整することが可能なようで、具体的には以下のようにフィルターフックで設定します。
function change_heartbeat_settings( $settings ) { $settings['interval'] = 5; return $settings; } add_filter( 'heartbeat_settings', 'change_heartbeat_settings' );
更新間隔を5秒に変更したのが上のコードになります。5~60秒の間の数値をセットすることができるようにですが、実際に更新間隔を確認してみると、必ずしもセットした秒数のとおりにリクエストが行われるわけではないようです。
サーバ負荷の制御という観点から、管理画面を第三者ユーザーに公開するアプリケーションをWordPressで開発する際には、把握しておきたいノウハウです。
heartbeat APIについては、heartbeat APIでリアルタイムダッシュボードを作成の記事もありますので参考にしてください。