加载了两个帖子而不是一个?

时间:2017-05-29 作者:FrelonGuepe

我正在尝试向我的Wordpress网站添加阅读帖子功能。为了实现这一点,我创建了一个cookie,其中存储了所有读帖子的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\');
我试着用不同的钩子,比如wp , inittemplate_redirect 但所有这些都给出了相同的结果。它不只是将当前帖子的ID附加到cookie中,而是添加了两个ID。当前帖子的ID和在当前帖子之后发布的帖子的ID。就像我在加载两个不同的帖子。但是,如果cookie中没有最近的帖子,它只会添加该帖子的ID,当然,如果有最近的帖子!

下面是加载页面之前和之后的cookie的外观:/0/221/46/和:/0/221/46/292/82/

我不知道为什么会这样。这对我来说就像是黑魔法。如果你们有什么想法,我将非常感谢你们的帮助!谢谢

2 个回复
最合适的回答,由SO网友:FrelonGuepe 整理而成

我按照@Mark kaplen的建议使用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=/";
});
下面是我如何告诉WP加载它,并使postID可以从JS访问的:

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

SO网友:Mark Kaplun

问题的核心是,您在访问内容时设置cookie,而不是在读取内容时设置cookie。浏览器可以尝试预取内容,您的描述听起来就像浏览器正在完善标题中的“下一个”链接。

根据经验,您应该避免在服务器上设置cookie,而更喜欢在客户端设置cookie(在html中添加一个小的JS来设置cookie),或者如果可能的话,最好使用本地存储。

结束

相关推荐

使用QUERY_POSTS()从循环中排除第一个POST(粘性或非粘性)

我正在使用query_posts( \'offset=1\' ); 将第一篇文章从循环中排除。但是,如果第一个帖子是粘性帖子,则会显示该帖子,而第二个(非粘性)帖子不会显示。是否有任何方法可以隐藏第一篇帖子,无论它是否有粘性?我不能使用ignore_sticky_posts 因为我只想隐藏第一个。谢谢你的帮助!