ワードプレスにログイン中に定期的に通信が発生するHeartbeat という仕組みについて解説いたします。

WordPress Heartbeat APIとは何をしていたどんな仕組みで動いている?

ワードプレスの通信に、何もしていなくても度々hearbeatというadmin-ajax.php向けのaction通信がある事に気づかれている開発者の方がいらっしゃるかもしれません。

ワードプレスには定期的(何も設定していない場合は15秒に1度)にhearbeat apiという仕組みでバックグランドでブラウザーとサーバー間で通信を行う仕組みがついています。
この通信によって下記のような作業が自動で行われます。

・投稿や固定ページを自動保存します。

・別のユーザーが同じコンテンツを編集中であることを検査し、上書きを防止します。

・セッションを監視し、セッションが切れた場合にログイン画面を再度表示したりします。

・その他プラグインが何らかの独自機能で使用します。

HeartBeat APIはどのように動作している?

上記のような15秒間に一度実行されるheat beat通信は
\wp-includes\js\heartbeat.js というJAVASCRIPTファイルが読み込まれ、この中の定期実行のスクリプトによって実行されています。
その後さまざまなワードプレスの関数が呼び出され、自動保存等の機能が発火します。

HeartBeat APIの活用方法

ワードプレスの管理画面で15秒に1回、何らかの定期実行したいことがある場合、この仕組みを利用できます。

※テーマのfunctions.phpなどに記載します。

add_filter( 'heartbeat_received', 'my_realtime_counter', 10, 2 );
function my_realtime_counter( $response, $data ) {
	//15秒に一度実行するコード
    return $response;
}

任意のJSコードを実行することもできます。
下記のサンプルでは、hear beatAPIでmy_dashboard_functionというカスタムイベントと送信データを追加し、それをフッターに追加したJAVASCRIPTで受け取って、追加した値をアラートに15秒に1回表示するサンプルコードとなります。

add_filter( 'heartbeat_received', 'my_heartbeat', 10, 2 );
function my_heartbeat( $response, $data ) {

    // JS に「このイベントを実行せよ」と知らせる
    $response['run_custom_js'] = array(
        'event' => 'my_dashboard_function',
        'value' => 123,
    );

    return $response;
}

add_action( 'admin_footer', 'my_admin_custom_js' );
function my_admin_custom_js() {
?>
<script>
jQuery(document).on('heartbeat-tick', function(e, data) {

    if ( data.run_custom_js.event == "my_dashboard_function" ) {
        alert(data.run_custom_js.value);
    }

});
</script>
<?php
}

その他のheat beatの関連の設定コード

下記のコードでHeartBeat APIの実行間隔を変えることが出来ます。

add_filter( 'heartbeat_send', 'my_heartbeat_setting' );
function my_heartbeat_setting( $settings ) {
    $settings['interval'] = 60; // 秒
    return $settings;
}

下記のようなコードでheartbeat.jsの読み込みを停止しHeartBeat APIを止めることもできます。
※ただこれをしてしまうと自動保存等の仕組みが動作しなくなるのでお勧めは致しません。

add_action( 'init', function() {
    wp_deregister_script( 'heartbeat' );
});

ご参考になりましたら幸いです。

WordPress ワードプレスの修正・バグフィクス・PHPやJAVASCRIPTコーディングのご相談・ご依頼はWPドクターまでお気軽にお送りください