2017-01-21 5 views
1

Я создал плагин, который использует фрагменты WooCommerce, чтобы показать пользователю, сколько у них очков. Когда пользователь использует некоторые из точек (добавив товар в корзину), все работает нормально.Force WooCommerce для обновления фрагмента

Но когда администратор добавляет точки пользователю по админ-интерфейсу, фрагмент не обновляется, пока пользователь не добавит новый товар в корзину.

Вот пример кода:

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

После долгих разрывов, если это окончательно выяснено, почему это происходит.

Прежде всего: 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'); 
} 

Я надеюсь, что это поможет кому-то, чтобы не тратить целый день, пытаясь решить it ;-)

5

Возможно, более короткий ответ, вызвав обработчик ядра, найденный в Woocommerce, для обновления фрагментов с помощью ajax.

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

refresh_fragments(); 
setInterval(refresh_fragments, 60000); 

Этот код должен вызвать следующую функцию привязываться к «wc_fragment_refresh», найденного в корзину-fragments.js

function refresh_cart_fragment() { 
    $.ajax($fragment_refresh); 
} 
+0

Спасибо большое за ответ, однако, пожалуйста, добавьте больше описание и/или информацию, и как он решает заданную проблему, чтобы другие могли легко ее понять, не прося разъяснений :) – koceeng

+0

Ты лучший. Спасибо тебе большое. – efoula

Смежные вопросы