Heartbeat API #3

Cet article est la conclusion de Heartbeat API et Heartbeat API #2

Cette fois c’est la fin de l’exemple. Je veux effectuer des opérations qui mettent à jour en (quasi) temps réel la page de mon site.

La façon dont ça va se passer est la suivante :

  • j’ai un logiciel Python qui met à jour mon site en utilisant l’API REST WordPress et celle de Woocommerce
  • Ce logiciel Python stocke dans la BDD les modifications effectuées
  • La page de mon article fait du long polling afin de regarder s’il y a des changements et si oui les affiche

Liste des articles modifiés récemment

Tout d’abord je crée une fonction PHP dans mon plugin, qui retourne la liste des articles modifiés dans la journée. Je veux que cette liste soit triée de façon ascendante, sur la date.

/*
Fonction qui retourne la liste des articles modifiés depuis $d
$d est un nombre qui indique depuis combien de jours 
*/
function liste_post_modifies_t($d) {


    // http://www.geekpress.fr/wp-query-creez-des-requetes-personnalisees-dans-vos-themes-wordpress/
    // https://codex.wordpress.org/Class_Reference/WP_Query
    
    // Je laissi ça ici pour memoire au caus où je voudrais modifier la fonction
    // $today = getdate();    
	// $query = new WP_Query( 'year=' . $today['year'] . '&monthnum=' . $today['mon'] . '&day=' . $today['mday'] );


    $args = array(
    	'post_type' => 'product',
    	'posts_per_page' => 5,
    	'post_status' => 'publish',
    	
    	'orderby' => 'post_modified',
		'order'   => 'DESC',
    	
    	'date_query' => array(
    		/* Pour mémoire
			array(
				'year'  => $today['year'],
				'month' => $today['mon'],
				'day'   => $today['mday']-7,
			),
			*/
			
			array(
			'column' => 'post_modified',
			'after'  => $d. ' day ago',
		),
		),
		
		'ignore_sticky_posts' => '1'
    
	);

	// 2. on exécute la query
	$my_query = new WP_Query($args);
	
	return ($my_query) ;
} 
	

Ensuite je modifie la fonction myplugin_receive_heartbeat (voir articles précédents) pour qu’elle retourne à JS la liste des ID des 3 derniers posts modifiés :


function myplugin_receive_heartbeat( $response, $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'];
    
    
    // http://www.geekpress.fr/wp-query-creez-des-requetes-personnalisees-dans-vos-themes-wordpress/
    // https://codex.wordpress.org/Class_Reference/WP_Query
    
    // $today = getdate();    
	// $query = new WP_Query( 'year=' . $today['year'] . '&monthnum=' . $today['mon'] . '&day=' . $today['mday'] );

	$my_query = liste_post_modifies_t(7) ;
 	
    // $response['myplugin_customfield_hashed'] = sha1( $received_data );
    if ( $my_query->have_posts() ) {    	
    	// $response['myplugin_customfield_hashed'] = print_r($my_query->posts[0]->ID, true) . "," . print_r($my_query->posts[1]->ID, true) ; 
    	// $response['myplugin_customfield_hashed'] = (string) $my_query->found_posts;
    	$nb_response = $my_query->found_posts;
    	$i = 0 ;
    	while ($i <3 && $i < $nb_response) { 
    		$response['myplugin_customfield_hashed'] = $response['myplugin_customfield_hashed'] . print_r($my_query->posts[$i]->post_title, true) . "," ;
    		$i++ ;
    	}
    	$response['myplugin_customfield_hashed'] = substr($response['myplugin_customfield_hashed'], 0, -1);
	} 
	else {
		$response['myplugin_customfield_hashed'] = sha1( $received_data );
	}		
    return $response;
} 

Quant à mon fichier JS, c’est celui-ci :


jQuery( document ).on( 'heartbeat-send', function ( event, data ) {
    // Add additional data to Heartbeat data.
    data.myplugin_customfield = 'some_data';
    return ;
});


jQuery( document ).on( 'heartbeat-tick', function ( event, data ) {
    if ( ! data.myplugin_customfield_hashed ) {
        return;
    }
  
    // alert( 'The hash is ' + data.myplugin_customfield_hashed );
    jQuery( "#abcde" ).html( "<p>" + data.myplugin_customfield_hashed + "</p>" );
    jQuery( "div.fgh" ).html( "<p>" + data.myplugin_customfield_hashed + "</p>" );
});