Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Bring WordPress to Life with the Heartbeat API

Mike Schroder
January 18, 2014

Bring WordPress to Life with the Heartbeat API

A walkthrough of the Heartbeat API available in WordPress 3.6+, which allows developers to quickly add live-updates to WordPress’ panel or front-end using native AJAX APIs.

We’ll go through core’s current uses of HeartBeat, how it works, and how to use it in your own plugins to add dynamically updating content within the WordPress admin or front-end.

Presented at WordCamp Phoenix 2014 by Mike Schroder
Sample Code at: https://gist.github.com/getsource/6254495

Mike Schroder

January 18, 2014
Tweet

More Decks by Mike Schroder

Other Decks in Technology

Transcript

  1. Bring WordPress to Life with the Heartbeat API WordCamp Phoenix

    2014 Mike Schroder (DH-Shredder) @GetSource - http://www.getsource.net
  2. Who Am I? • Mike Schroder, a.k.a DH-Shredder, a.k.a. @GetSource

    • Third Culture Kid, enjoy Coffee & Sailing • WordPress Core Rep and WP-CLI Contributor • Happy DreamHost Employee
  3. JS Trigger Flow ! ! -> heartbeat-send -> heartbeat-tick -/>

    heartbeat-error ! ! (wp-includes/js/heartbeat.js)
  4. PHP Filter/Action Flow ! ! -> heartbeat_received -> heartbeat_send ->

    heartbeat_tick (action) ! ! (wp-admin/includes/ajax-actions.php)
  5. if ( ! empty( $_POST['data'] ) ) { $data =

    (array) $_POST['data']; $response = apply_filters( 'heartbeat_received', $response, $data, $screen_id ); } $response = apply_filters( 'heartbeat_send', $response, $screen_id ); ! // Allow the transport to be replaced with long-polling easily do_action( 'heartbeat_tick', $response, $screen_id ); // Send the current time according to the server $response['server_time'] = time(); wp_send_json($response); Direct from core.
  6. <?php /* Plugin Name: Heartbeat Comment Update Description: Updates Comment

    Count on Dashboard with Heartbeat. Author: Andrew Ozz, Mike Schroder Version: 0.2 Author URI: http://www.getsource.net */ ! add_filter( 'heartbeat_received', 'wc_heartbeat_comment_count', 10, 3 ); function wc_heartbeat_comment_count( $response, $data, $screen_id ) { ! // ... ( Read Data, Edit Response ) ! // Pass along filtered response. return $response; } Listen, then Return.
  7. // Check if we are on the right screen and

    data is requested. if ( $screen_id == 'dashboard' && isset( $data['wc-comment-heartbeat'] ) ) { ! // Grab our data $num_comments = wp_count_comments(); ! // Add data in an unique array key -- prefix! $response['wc-comment-count'] = array( 'comment-count' => number_format_i18n($num_comments->total_comments), 'pending-count' => number_format_i18n($num_comments->moderated), 'comment-mod-count' => number_format_i18n($num_comments->moderated), 'spam-count' => number_format_i18n($num_comments->spam), 'trash-count' => number_format_i18n($num_comments->trash), ); } ! // Pass along filtered response return $response; } Retrieve Data
  8. add_action( 'admin_enqueue_scripts', 'wc_heartbeat_comment_script_enqueue' ); function wc_heartbeat_comment_script_enqueue( $hook_suffix ) { !

    // Load this script only in the dashboard. if ( 'index.php' != $hook_suffix ) return; ! // Make sure the JS part of the Heartbeat API is loaded. wp_enqueue_script( 'heartbeat' ); ! // Output the JavaScript we need. add_action( 'admin_print_footer_scripts', 'wc_heartbeat_comment_js', 20 ); ! } Enqueue Script
  9. function wc_heartbeat_comment_js() { ?> <script> jQuery(document).ready( function($) { ! //

    Request comment count, using prefixed custom event. $(document).on( 'heartbeat-send.wp-comment-count', function( e, data ) { ! // For one-time send, use: // wp.heartbeat.enqueue( 'item', 'value' ); data['wc-comment-heartbeat'] = 'count'; ! // Speed up heartbeat for faster results. // Only has to be called every 2.5 minutes. window.wp.heartbeat.interval(15); ! // ... Request Data
  10. // ... // Listen for the tick custom event. }).on(

    'heartbeat-tick.wc-comment-count', function( e, data ) { ! // Double-check we have the data we're listening for if ( ! data['wc-comment-count'] ) return; ! // Replace all of the comment counts $.each( data['wc-comment-count'], function( key, value ) { var replaced = $( '.' + key ).html().replace(/(.*)\d+(.*)/g, "$1" + value + "$2"); $( '.' + key ).html( replaced ); }); ! // Initial connection to cement our new interval timing window.wp.heartbeat.connectNow(); }); }); </script> <?php } Receive Data