我创建了一个插件,它使用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); ?>::有没有办法强制片段刷新自己?
1> Chris Medina..:通过触发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> Jan Herzán..:经过几个小时的挖掘,如果最终弄清楚,为什么会发生这种情况.
首先要做的事情是: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' ); }我希望这能帮助别人不花一整天时间来解决它;-)