我创建了一个插件,它使用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');
有没有办法强制片段刷新自己?
答案 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 会话更适合我的用例。