Découverte de l'API Heartbeat

WPTech Nantes 2014

Sommaire

  • Qu'est-ce que l'API Heartbeat ?

  • Comment l'utiliser

  • Aller plus loin

Qu'est-ce que l'API Heartbeat ?

Qu'est-ce que l'API Heartbeat ?

Introduit avec WordPress 3.6

Qu'est-ce que l'API Heartbeat ?

Permet d'établir une communication périodique navigateur <=> serveur

Qu'est-ce que l'API Heartbeat ?

Chaque battement permet

  • D'envoyer des données (client)
  • De les traiter (serveur)
  • D'exploiter la réponse (client)

Qu'est-ce que l'API Heartbeat ?

Exemple dans WordPress

Qu'est-ce que l'API Heartbeat ?

Exemple dans WordPress

Comment l'utiliser ?

Comment l'utiliser

Ajouter les scripts nécessaires

function hbd_register_scripts() {
    wp_enqueue_script( 'heartbeat' );
    wp_enqueue_script( 'heartbeat-demo',
        plugin_dir_url( __FILE__ ) . 'heartbeat-demo.js',
        'heartbeat', '1.0', true );
}
add_action( 'wp_enqueue_scripts', 'hbd_register_scripts' );

Comment l'utiliser

Le JS de communication

jQuery(document).ready( function($) {
    // Données à envoyer au serveur
    var args = {
       'data': 'hello world'
    }

    /* Met en file les données qui seront envoyées au serveur
    ** au prochain battement
    */
    wp.heartbeat.enqueue(
        'liveComment', // identifiant
        args,
        false // écraser ou non les données existantes, false = oui
    );

    $(document).on( 'heartbeat-tick.liveComment', function( event, data ) {
        // Traitement des données retournées par le serveur
    });
});

Comment l'utiliser

Traitement et retour des données côté serveur

function hbd_live_respond_to_server( $response, $data ) {
    if ( isset( $data['liveComment'] ) ) {
        if ( !isset( $data['liveComment']['data'] )
            return false;

            $response['liveComment'] = array(
                'returnData' => 'hello you',
            );
    }

    return $response;
}
add_filter( 'heartbeat_received', 'hbd_live_respond_to_server', 10, 2 );
add_filter( 'heartbeat_nopriv_received', 'hbd_live_respond_to_server', 10, 2 );

Comment l'utiliser

Utilisation des données retournées côté client

$(document).on( 'heartbeat-tick.liveComment', function( event, data ) {
    // hasOwnProperty permet de vérifier si des données ont été retournées
    if ( data.hasOwnProperty( 'liveComment' ) ) {
        if ( data['liveComment'].returnData ) {
            alert( data['liveComment'].returnData );
        }
    }
    wp.heartbeat.enqueue(
        'liveComment',
        args,
        false
    );
});

Aller plus loin

Aller plus loin

Passer des données avec wp_localize_script()

<?php

wp_localize_script(
    'heartbeat-demo', // identifiant du script 
    'heartbeatDemoAttrs', // nom de la variable qui va contenir les données
    array( 'id' => $post->ID ) // Données à passer
);

?>

Aller plus loin

Utiliser ces données en JS

var args = {
       'id' : heartbeatDemoAttrs['id']
    }

wp.heartbeat.enqueue(
        'liveComment',
        args,
        false
    );

Aller plus loin

Gestion des erreurs côté client

$(document).on('heartbeat-error.liveComment',
    function( e, jqXHR, textStatus, error ) {
        console.log( textStatus );
        console.log( error );
    }
);

Aller plus loin

Régler l'intervalle des battements par défaut

function hbd_heartbeat_settings( $settings ) {
    $settings['interval'] = 15; // Minimum 15, Maximum 120
    return $settings;
}
add_filter( 'heartbeat_settings', 'hbd_heartbeat_settings' );

De base toutes les 60 secondes

Aller plus loin

Régler l'intervalle des battements côté client

// Toutes les 5 secondes pendant 2 min 30 sec maximum
wp.heartbeat.interval( 'fast' );

wp.heartbeat.interval( int ); // valeurs possibles : 5, 15, 30, 60, 120

Aller plus loin

Régler l'intervalle des battements côté serveur

function hbd_live_respond_to_server( $response, $data ) {
    if ( isset( $data['liveComment'] ) ) {
        if ( !isset( $data['liveComment']['data'] )
            return false;

            $response['liveComment'] = array(
                'returnData' => 'hello you',
            );
            
            $response['heartbeat_interval'] = 'fast';
    }

    return $response;
}
add_filter( 'heartbeat_received', 'hbd_live_respond_to_server', 10, 2 );
add_filter( 'heartbeat_nopriv_received', 'hbd_live_respond_to_server', 10, 2 );

Aller plus loin

Manipuler les données en attente

// Vérifier si des données sont en attente
wp.heartbeat.isQueued( 'liveComment' );

// Enlever des données en attente
wp.heartbeat.dequeue( 'liveComment' );

// Récupérer les données en attente
wp.heartbeat.getQueuedItem( 'liveComment' );

Ressources

  • http://wabeo.fr/commentaires-heartbeat-api/
  • https://pippinsplugins.com/using-the-wordpress-heartbeat-api/
  • https://tommcfarlin.com/wordpress-heartbeat-api/
  • http://code.tutsplus.com/tutorials/the-heartbeat-api-getting-started--wp-32446

Rémy Perona

Développeur/intégrateur WP

Me retrouver sur :

  • http://remyperona.fr
  • Twitter : @theloopfr