web-dev-qa-db-ja.com

1つではなく2つの投稿がロードされていますか?

私は私のWordpressのウェブサイトに記事を読む機能を追加しようとしています。これを達成するために、私は私が読んだ投稿のすべてのIDを保存するクッキーを作ります。投稿がロードされるたびに、次の関数が起動されます。

function readPosts() {
    if (is_single()){
        $postId = get_the_id() . "/";
        $cookie = empty($_COOKIE['readposts']) ? "/0/" : $_COOKIE['readposts'];
        if(strpos($cookie, ("/" . $postId)) === false){
            $val = $cookie . $postId;
            setcookie('readposts', $val, time() + 3141592, "/");
        }
    }
}
add_action('get_header', 'readposts');

私はwpinittemplate_redirectなどの異なるフックを使用してみましたが、すべて同じ結果が得られています。現在の投稿のIDのみをCookieに追加する代わりに、2つのIDを追加します。現在の投稿のIDと、現在の投稿の直後に公開された投稿のID。 2つの異なる投稿をロードしているように。ただし、まだCookieに含まれていない場合、およびより最近の投稿がある場合は、より最近の投稿のIDが追加されるだけです。

ページを読み込む前のCookieの外観は次のとおりです。/ 0/221/46 /あとに/ 0/221/46/292/82 /

私はなぜこれが起こっているのかわかりません。私にとっては暗い魔法のようです。あなたの誰かが考えを持っているならば、私はあなたの助けに非常に感謝します!ありがとう

1
FrelonGuepe

@Mark Kaplunが示唆したように私はJavaScriptのやり方をしました、そしてそれはうまくいきます。もう重複はありません。興味のある人のための私のJSはこれです:

jQuery(document).ready(function($) {
    var name = "readposts=";
    var decodedCookie = decodeURIComponent(document.cookie);
    var ca = decodedCookie.split(';');

    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') {
            c = c.substring(1);
        }
        if (c.indexOf(name) == 0) {
            var cookie = c.substring(name.length, c.length);
        }
    }

    if(cookie == "")
        cookie = "/0/" + my_script_vars.postID + "/";
    else if(cookie.indexOf("/" + my_script_vars.postID + "/") === -1)
        cookie += my_script_vars.postID + "/";

    var d = new Date();
    d.setTime(d.getTime() + (30*24*60*60*1000));
    var expires = "expires="+ d.toUTCString();
    document.cookie = "readposts=" + cookie + ";" + expires + ";path=/";
});

そして、これをロードしてJSからpostIDにアクセスできるようにWPに指示する方法は次のとおりです。

function wpse268423_enqueue_cookie_script(){    
     if (is_single()){
          global $post;
          wp_enqueue_script('cookie_read_posts', get_template_directory_uri() 
                    . '/js/cookie_read_posts.js' );
          wp_localize_script('cookie_read_posts', 'my_script_vars', array(
                    'postID' => $post->ID)
          );
     }
}
add_action('get_header', 'wpse268423_enqueue_cookie_script');
2
FrelonGuepe

問題の核心は、コンテンツがアクセスされているときにクッキーが設定されるのであり、それが読み取られるときには設定されないことです。ブラウザはコンテンツをプリフェッチしようとすることができます、そしてあなたの説明はブラウザのように聞こえてヘッダの中にある「次の」リンクを好むのです。

経験上、サーバにクッキーを設定しないでクライアント側に設定することをお勧めします(クッキーを設定する小さなJSをhtmlに追加する)、または可能であればローカルストレージを代わりに使用してください。

3
Mark Kaplun