動作の仕組み
ページが読み込まれると、クライアントサイドのハートビートコードは、15〜120秒ごとに実行される間隔(「ティック」と呼ばれる)を設定します。実行されると、ハートビートはデータを収集し、jQueryイベントを介して送信し、サーバーに送信して応答を待ちます。サーバーでは、admin-ajaxハンドラーが渡されたデータを受け取り、応答を準備し、応答をフィルタリングし、JSON形式でデータを返します。クライアントはこのデータを受け取り、データが受信されたことを示す最終的なjQueryイベントを発火させます。
カスタムハートビートイベントの基本的なプロセスは次のとおりです:
- 1. 送信されるデータに追加フィールドを追加する(JS
heartbeat-send
イベント) - 2. PHPで送信されたフィールドを検出し、追加の応答フィールドを追加する(
heartbeat_received
フィルター) - 3. JSで返されたデータを処理する(JS
heartbeat-tick
)
(必要な機能に応じて、これらのイベントのうち1つまたは2つだけを使用することを選択できます。)
APIの使用
ハートビートAPIを使用するには、JavaScriptでの送信および受信コールバックと、PHPで渡されたデータを処理するためのサーバーサイドフィルターの2つの異なる機能が必要です。
サーバーへのデータ送信
ハートビートがサーバーにデータを送信する際に、カスタムデータを含めることができます。これは、サーバーに送信したい任意のデータ、またはデータを期待していることを示す単純なtrue値である可能性があります。
jQuery( document ).on( 'heartbeat-send', function ( event, data ) {
// Add additional data to Heartbeat data.
data.myplugin_customfield = 'some_data';
});
サーバーでの受信と応答
サーバー側では、このデータを検出し、応答に追加のデータを追加できます。
/**
* Receive Heartbeat data and respond.
*
* Processes data received via a Heartbeat request, and returns additional data to pass back to the front end.
*
* @param array $response Heartbeat response data to pass back to front end.
* @param array $data Data received from the front end (unslashed).
*
* @return array
*/
function myplugin_receive_heartbeat( array $response, array $data ) {
// If we didn't receive our data, don't send any back.
if ( empty( $data['myplugin_customfield'] ) ) {
return $response;
}
// Calculate our data and pass it back. For this example, we'll hash it.
$received_data = $data['myplugin_customfield'];
$response['myplugin_customfield_hashed'] = sha1( $received_data );
return $response;
}
add_filter( 'heartbeat_received', 'myplugin_receive_heartbeat', 10, 2 );
応答の処理
フロントエンドに戻ると、このデータを受信する処理を行うことができます。
jQuery( document ).on( 'heartbeat-tick', function ( event, data ) {
// Check for our data, and use it.
if ( ! data.myplugin_customfield_hashed ) {
return;
}
alert( 'The hash is ' + data.myplugin_customfield_hashed );
});
すべての機能がこれらの3つのステップすべてを必要とするわけではありません。たとえば、サーバーにデータを送信する必要がない場合は、後の2つのステップだけを使用できます。