Como verificar se novas postagens foram publicadas desde o carregamento da página?

4

Meu objetivo é usar a API Heartbeat para verificar se novas postagens foram publicadas desde que a página inicial do blog foi carregada. Se novas postagens forem publicadas, mostrarei um link na parte superior da tela "16 novas postagens" que, quando clicado, insere as novas postagens no DOM.

Meu problema:

Como posso verificar se novas postagens foram publicadas desde que a página inicial do blog foi carregada?

Meu PHP até agora:

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 );

Meu script até agora:

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

2 respostas

3

Determinando a hora atual

Existe a função current_time() no core que permite passar três valores diferentes como primeiro argumento e gmt (o offset) como segundo argumento. Sobre o 1º:

  1. mysql - > gmdate( 'Y-m-d H:i:s' ) , legível por humanos, por exemplo, 2004/07/8 13:35:19
  2. timestamp - > time() , o timestamp do UNIX para, por exemplo, %código%
  3. Um argumento personalizado que é uma string de formatação válida para a função PHP 1335939007 ,

    por exemplo date()

Agora vamos apenas com

$now = current_time( 'mysql' );

para não obter o timestamp do UNIX de (praticamente) agora , pois o D, d M Y H:i:s precisará de algo que ela possa transformar em timestamp do UNIX usando WP_Query .

Consulta de novas postagens

Em seguida, usaremos a cláusula strtotime() com date_query para consultar as postagens mais tarde do que agora . Eu uso o argumento after para reduzir o impacto no banco de dados. Isso significa que o resultado será usado apenas para verificar se recebemos postagens mais recentes e buscar apenas os IDs em vez de linhas inteiras.

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

... então fields manterá a quantidade de posts para a consulta.

Para onde ir a partir daqui?

O que você considera "finalizado" é com você. Você poderia adicionar query / check acima a algo como o evento jQuery $newer_posts_IDs->found_posts , incluí-lo no ( document ).ready() hook ou o que lhe agrada.

Por fim, você precisará repetir a consulta acima com um conjunto inteiro de linhas, obtidas por meio de . Pesquise através das minhas respostas sobre esse tópico .

Você provavelmente deseja inseri-los em um ponto específico no DOM e adicionar um recipiente vazio como espaço reservado. O jQuery oferece a função de API shutdown caso você já tenha postagens. Senão você provavelmente só usará .before() para inserir seu conteúdo.

    
por kaiser 03.09.2014 / 19:34
1

Primeiro você precisa dar a ele a data para enviar quando os carrapatos chegarem:

// 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();
});

Nós preparamos o campo, agora vamos ouvir quando o coração apertar:

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

Agora a parte do 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;
}

Espero que isso ajude.

    
por aifrim 03.09.2014 / 19:38