强制WooCommerce更新片段

时间:2017-01-21 17:33:49

标签: php wordpress woocommerce

我创建了一个插件,它使用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);

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

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

3 个答案:

答案 0 :(得分:14)

通过触发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 );
}

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:1)

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