强制WooCommerce更新片段

Jan*_*zán 5 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');
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*ina 16

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

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

refresh_fragments();
setInterval(refresh_fragments, 60000);
Run Code Online (Sandbox Code Playgroud)

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

function refresh_cart_fragment() {
    $.ajax( $fragment_refresh );
}
Run Code Online (Sandbox Code Playgroud)


Jan*_*zán 8

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

首先要做的事情是: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);
});
Run Code Online (Sandbox Code Playgroud)

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

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' );
}
Run Code Online (Sandbox Code Playgroud)

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