当前位置:  开发笔记 > 编程语言 > 正文

强制WooCommerce更新片段

如何解决《强制WooCommerce更新片段》经验,为你挑选了2个好方法。

我创建了一个插件,它使用WooCommerce片段向用户显示他们有多少积分.当用户使用某些点(通过将产品添加到购物车中)时,一切正常.

但是当admin通过admin-interface向用户添加点数时,片段不会更新,直到用户将新产品添加到购物车中.

这是代码示例:

function create_points_widget_content() {
    $usersPoints = esc_attr( get_user_meta( get_current_user_id(), USERS_POINTS, true ));
    if (!isset($userPoints) || $userPoints == "") $userPoints = 0;
    $usedPoints = get_current_points_in_cart('', 0);

    ?>
        
:
:

有没有办法强制片段刷新自己?



1> Chris Medina..:

通过触发Woocommerce中的核心处理程序通过ajax刷新片段,可能会有一个较短的答案.

function refresh_fragments() {
    console.log('fragments refreshed!');
    $( document.body ).trigger( 'wc_fragment_refresh' );
}

refresh_fragments();
setInterval(refresh_fragments, 60000);

此代码应触发绑定到cart-fragments.js中的'wc_fragment_refresh'的以下函数

function refresh_cart_fragment() {
    $.ajax( $fragment_refresh );
}



2> Jan Herzán..:

经过几个小时的挖掘,如果最终弄清楚,为什么会发生这种情况.

首先要做的事情是:Woocommerce将片段的内容保存到浏览器内的sessionStorage中,并且在将新产品插入购物车之前不会更新它.另一方面,会话监视sessionStorage的更改,以便在所有选项卡(如果有)同时更新片段.

基于此,我创建了简单的解决方案,在页面重新加载后刷新片段,然后每分钟更新片段.

重新加载所需的javascript:

jQuery( function ($) {
    var cart_hash_key = substitutions.cart_hash_key;

    function refresh_fragments() {
        // Better to put there 'blank' string then empty string
        window.sessionStorage.setItem(cart_hash_key, 'blank'); 
        var e = $.Event("storage");

        e.originalEvent = {
            key: cart_hash_key,
        };

        $(window).trigger(e);
    }

    refresh_fragments();
    setInterval(refresh_fragments, 60000);
});

最后一点是将脚本插入到具有正确替换的页面中:

function register_load_fragments_script() {
    // Register the script
    wp_register_script( 'load-fragments-script', get_template_directory_uri() . '/js/load-fragments.js', array(), '20170121', true  );

    // Substitustions in script
    $translation_array = array(
        'cart_hash_key' => WC()->ajax_url() . '-wc_cart_hash'
    );
    wp_localize_script( 'load-fragments-script', 'substitutions', $translation_array );

    wp_enqueue_script( 'load-fragments-script' );
}

我希望这能帮助别人不花一整天时间来解决它;-)

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有