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)
经过几个小时的挖掘,如果最终弄清楚,为什么会发生这种情况.
首先要做的事情是: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)
我希望这能帮助别人不花一整天时间来解决它;-)