【问题标题】:Force WooCommerce to update fragment强制 WooCommerce 更新片段
【发布时间】:2017-01-21 17:33:49
【问题描述】:

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

但是当管理员通过管理界面向用户添加积分时,片段不会更新,直到用户将新产品添加到购物车中。

这里是代码示例:

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

    ?>
        <div class="points-widget-v2">
            <div><?php echo __("Your points", "plugin-domain"); ?>:<span class="users-points"><?php echo $usersPoints; ?></span></div>
            <div><?php echo __("Actually used", "plugin-domain"); ?>:<span class="used-points"><?php echo $usedPoints; ?></span></div>
        </div>
    <?php
}

// Update top right price
function add_points_widget_to_fragment( $fragments ) {
    global $woocommerce;
    ob_start();

    create_points_widget_content();

    $fragments['div.points-widget-v2'] = ob_get_clean();
    return $fragments;
}
add_filter('add_to_cart_fragments', 'add_points_widget_to_fragment');

有什么方法可以强制fragment自己刷新吗?

【问题讨论】:

    标签: php wordpress woocommerce


    【解决方案1】:

    通过触发 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】:

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

    首先要做的事: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' );
    }
    

    我希望这将帮助人们不要整天试图解决它;-)

    【讨论】:

    • 感谢您指出购物车片段存储在会话中并在购物车项目添加/删除时更新。我修改了迷你购物车模板,但不明白为什么我的更改没有反映在前端。原来我只需要删除一个产品。
    【解决方案3】:

    就我而言,我只想为所有用户刷新一次购物车,因为我对购物车商品的显示方式进行了重大更改。使用脚本需要我在一段时间后将其删除(当我认为我的大多数用户已经刷新了他们的购物车时)。我发现通过转到 Woocommerce -> 工具并单击清除客户会话下的Clear 来清除所有现有的 Woocommerce 会话,以更适合我的用例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多