web-dev-qa-db-fra.com

Comment vérifier si de nouvelles publications ont été publiées depuis le chargement de la page?

Mon objectif est d'utiliser l'API Heartbeat pour vérifier si de nouveaux messages ont été publiés depuis le chargement de la page d'accueil du blog. Si de nouveaux messages ont été publiés, je vais afficher un lien en haut de l'écran "16 nouveaux messages" qui, lorsque vous cliquez dessus, insérera les nouveaux messages dans le DOM.

Mon problème:

Comment puis-je vérifier si de nouveaux articles ont été publiés depuis le chargement de la page d'accueil du blog?

Mon PHP jusqu'à présent:

function new_post_check( $response, $data, $screen_id ) {

    // Do some processing here.

    // Respond.
    return $response;
}
add_filter( 'heartbeat_received', 'new_post_check', 10, 3 );
add_filter( 'heartbeat_nopriv_received', 'new_post_check', 10, 3 );

Mon script jusqu'à présent:

$( document ).on( 'heartbeat-tick.poll', function( event, data ) {
    // Print data to the console.
    console.log( data );
});
4
henrywright

Déterminer l'heure actuelle

Il y a la fonction current_time() dans core qui permet de passer trois valeurs différentes comme premier argument et gmt (le décalage) comme second argument. À propos du 1er:

  1. mysql -> gmdate( 'Y-m-d H:i:s' ) , lisible par l'homme par exemple 2004/07/8 13:35:19
  2. timestamp -> time() , l’horodatage UNIX, par exemple. 1335939007
  3. Un argument personnalisé qui est une chaîne de mise en forme valide pour PHP date() function,

    par exemple D, d M Y H:i:s

Maintenant, nous allons simplement aller avec

$now = current_time( 'mysql' );

tonotobtenir le timestamp UNIX de (assez bien)now, car le WP_Query aura besoin de quelque chose qu'elle pourra transformer en un timestamp UNIX en utilisant strtotime().

Interroger de nouveaux messages

Nous utiliserons ensuite la clause date_query avec after pour interroger les publicationslaterquenow. J'utilise l'argument fields pour réduire l'impact sur la base de données. Cela signifie que le résultat sera simplement utilisé pour vérifier si nous avons de nouvelles publications et uniquement récupérer les ID au lieu de lignes entières.

$newer_posts_IDs = new WP_Query( array(
    'post_type'  => 'post',
    'fields'     => 'ids',
    'date_query' => array(
        'after' => current_time( 'mysql' ),
    ),
) );

... alors $newer_posts_IDs->found_posts tiendra le nombre de messages pour la requête.

Où aller en partant d'ici?

Ce que vous considérez comme "fini" est à vous. Vous pouvez ajouter la requête/vérification ci-dessus à quelque chose comme l'événement jQuery ( document ).ready(), l'ajouter au crochet shutdown ou à tout autre choix qui vous plaira.

Enfin, vous devrez répéter la requête ci-dessus avec tout un ensemble de lignes, récupérées via ajax . Rechercher à travers mes réponses à ce sujet .

Vous voudrez probablement les insérer sur un point spécifique du DOM et y ajouter un conteneur vide comme espace réservé. jQuery offre la fonction .before() API au cas où vous auriez déjà reçu des publications. Sinon, vous utiliserez probablement simplement .html() pour insérer votre contenu.

3
kaiser

Vous devez d’abord lui donner la date à laquelle envoyer les tiques:

// Hook into the heartbeat-send and give him the milliseconds timestamp since Epoch
$(document).on('heartbeat-send', function(e, data) {
    data['now'] = new Date().getTime();
});

Nous avons préparé le champ, écoutons maintenant lorsque le cœur bat:

$(document).on('heartbeat-tick', function(e, data) {
    alert(data);
});

Maintenant la partie php:

$then = 0;
function my_heartbeat($response, $data)
{
    global $then;

    $then = date("Y-m-d H:i:s", $data['then']);

    add_filter('posts_where', 'filter_where_date');

    $query = new WP_Query(array('post_type' => 'post'));        
    $response['number'] = $query->found_posts;

    remove_filter('posts_where', 'filter_where_date');

    return $response;
}
add_filter('heartbeat_received', 'my_heartbeat', 10, 3);

function filter_where($where = '')
{
    global $then;

    $where .= " AND post_date >= {$then} AND post_date < NOW()";
    return $where;
}

J'espère que cela t'aides.

1
aifrim