web-dev-qa-db-ja.com

ページの読み込み以降に新しい投稿が公開されたかどうかを確認する方法

私の目的は、ブログのホームページが読み込まれてから新しい投稿が公開されているかどうかを確認するためにHeartbeat APIを使用することです。新しい投稿が公開されている場合は、画面上部に「16の新しい投稿」というリンクを表示します。このリンクをクリックすると、新しい投稿がDOMに挿入されます。

私の問題:

ブログのホームページが読み込まれてから新しい投稿が公開されたかどうかを確認する方法はありますか。

これまでのところ私のPHP:

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

これまでの私のスクリプト:

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

現在時刻の確認

最初の引数として3つの異なる値を渡し、2番目の引数としてgmt(オフセット)を渡すことができる current_time() 関数がコアにあります。 1日について:

  1. mysql - > gmdate( 'Y-m-d H:i:s' ) 、人間が読める形式、例えば2004/07/8 13:35:19
  2. timestamp - > time() 、例えばUNIXのタイムスタンプ1335939007
  3. PHPの有効なフォーマット文字列であるカスタム引数 date() function、

    例えばD, d M Y H:i:s

今私達はただ行きます

$now = current_time( 'mysql' );

WP_Queryにはstrtotime()を使ってUNIXタイムスタンプに変換できるものが必要になるので、notに(ほぼ)nowのUNIXタイムスタンプを取得します。

新しい投稿を問い合わせる

それではafterと一緒にdate_query節を使ってpostslaterよりnowをクエリします。データベースへの影響を減らすために、ここでfields引数を使用します。つまり、結果は新しい投稿があるかどうかをチェックし、行全体ではなくIDのみを取得するために使用されます。

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

... $newer_posts_IDs->found_postsはクエリの投稿数を保持します。

ここからどこへ行く?

あなたが「完成した」と考えるものはあなた次第です。 jQueryの( document ).ready()イベントのようなものに上記のquery/checkを追加するか、shutdownフックに追加するか、またはあなたを喜ばせることができます。

最後に、 ajax を使って取得した行全体を使って、上記のクエリを繰り返す必要があります。検索 そのトピックに対する私の回答を通して

おそらくDOMの特定の場所にそれらを挿入し、そこに空のコンテナをプレースホルダとして追加したいでしょう。あなたがすでに投稿している場合に備えて、jQueryは .before() API関数を提供します。そうでなければ、あなたはあなたのコンテンツを挿入するのにおそらく.html()を使うでしょう。

3
kaiser

まず、目盛りが来たときに送信する日付を彼に渡す必要があります。

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

私たちはフィールドを用意しました。ここで、ハートが刻むときを聞かせてください。

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

今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;
}

お役に立てれば。

1
aifrim