如何使登录/注销链接缓存独立?

时间:2019-04-16 作者:Ryszard Jędraszyk

我使用一个代码片段通过函数创建WooCommerce登录/注销链接。php,几乎出现在每一个Wordpress相关的网站上,并且投票率很高。像往常一样,它并没有真正起作用。

登录后,移动到以前以匿名用户身份访问的页面,将显示其缓存版本。这意味着将出现“登录”链接,尽管用户已经登录。刷新页面将更正菜单链接,显示“注销”,但从用户的角度来看,这并不是一个解决方案。

我使用插件WP Fastest Cache、AutoOptimize,并且我的服务器连接到Cloudflare CDN。它的顶部是浏览器缓存。

如果可能的话,我想让菜单缓存免疫,而不是放弃上面提到的任何解决方案,因为它们给了我卓越的网站速度和来自谷歌的爱(产品页面上的移动页面速度得分为98分)以及困难的解决方法。

我怎样才能做到这一点?有jQuery或Ajax解决方案吗?我想我需要找出wordpress\\u logged\\u in cookie是否设置为如下主题:

https://stackoverflow.com/questions/48511579/jquery-check-wordpress-logged-in-cookie

我会找出代码,只是需要一个方向来避免死胡同。

1 个回复
最合适的回答,由SO网友:Ryszard Jędraszyk 整理而成

解决方案来源:

https://stackoverflow.com/questions/48511579/jquery-check-wordpress-logged-in-cookie

是一条死胡同。它不适用于WooCommerce,因为登录不是通过标准的WordPress登录屏幕完成的,而是通过专用的登录表单完成的,并且当用户登录时,没有可通过JavaScript访问的cookie。

我通过jQuery Ajax创建了一个有效的解决方案,但我对结果不满意,因为链接出现有一些延迟。至少它们对于缓存的页面显示正确,用户不会感到困惑。

Then I sought for something both reliable and fast, what I perfectly found in this answer by Janos Szabo which shows how to create and delete script-accessible cookies on login and logout:

Check if user is logged in using JQuery

对于任何感兴趣的人,这里是我的Ajax解决方案的代码:

子主题“js”文件夹中“taisho.js”文件的内容:

jQuery.ajax(
{
    type: "post",
    url: my_ajax_object.ajax_url,
    data: {
        action: \'is_user_logged_in\'
    },
    success: function(response){        
        var menu_links = response == \'yes\' ? logged : anonymous;
        $(\'nav.secondary-navigation\').html(\'<ul id="menu-topmenu" class="menu">\' + menu_links + \'</ul>\');       
    }   
});
我的职能内容。php文件:

// Store login and my account + logout links as js variables for conditional display, to be used in js file.
add_action(\'wp_footer\', \'taisho_login_logout\');
function taisho_login_logout() {
    ?>
    <script type="text/javascript">

        var anonymous = <?php echo json_encode(
            \'<li><a href="\' . get_permalink( woocommerce_get_page_id( \'myaccount\' ) ) . \'">Log in</a></li>\'
            )?>;
        var logged = <?php echo json_encode(
            \'<li><a href="\'. get_permalink( woocommerce_get_page_id( \'myaccount\' )) . \'">My account</a></li>
            <li><a href="\'. wp_logout_url( get_permalink( woocommerce_get_page_id( \'myaccount\' ) ) ) . \'">Log out</a>               </li>\'
            )?>;    

    </script>
    <?php
}

// Enqueue js file residing in current (parent or child) theme and enable Ajax url in this file through wp_localize_script.
add_action( \'wp_enqueue_scripts\', \'taisho_login_check\' );
function taisho_login_check() {
    wp_enqueue_script( \'taisho-login-check\', get_stylesheet_directory_uri() . \'/js/taisho.js\', array(\'jquery\'));
    wp_localize_script( \'taisho-login-check\', \'my_ajax_object\', array( \'ajax_url\' => admin_url( \'admin-ajax.php\' ) ) );
}

// Check if user is logged in through Ajax.
add_action(\'wp_ajax_is_user_logged_in\', \'ajax_check_user_logged_in\');
add_action(\'wp_ajax_nopriv_is_user_logged_in\', \'ajax_check_user_logged_in\');
function ajax_check_user_logged_in() {
    echo is_user_logged_in()?\'yes\':\'no\';
    die();
}