Forzar a WooCommerce a actualizar el fragmento

4 minutos de lectura

Creé un complemento que usa fragmentos de WooCommerce para mostrarle al usuario cuántos puntos tiene. Cuando el usuario usa algunos de los puntos (al agregar el producto al carrito), todo funciona bien.

Pero cuando el administrador agrega puntos al usuario mediante la interfaz de administración, el fragmento no se actualiza hasta que el usuario agrega un nuevo producto al carrito.

Aquí hay un ejemplo de código:

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');

¿Hay alguna forma de forzar que los fragmentos se actualicen solos?

avatar de usuario
cris medina

Probablemente haya una respuesta más corta al activar un controlador central que se encuentra en Woocommerce para actualizar fragmentos a través de ajax.

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

refresh_fragments();
setInterval(refresh_fragments, 60000);

Este código debería activar la siguiente función vinculada a ‘wc_fragment_refresh’ que se encuentra en cart-fragments.js

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

  • Muchas gracias por la respuesta, sin embargo, agregue más descripción y/o información y cómo resuelve el problema planteado para que otros puedan entenderlo fácilmente sin pedir aclaración 🙂

    – koceeng

    24 de febrero de 2017 a las 2:42

  • Eres la mejor. muchas gracias

    – efula

    17/09/2017 a las 22:48

  • ¡Salva mi día! ¡Gracias!

    –Aleksandr Abramov

    25 dic 2021 a las 10:50

  • Ya no funciona como parece.

    –Steve Moretz

    30 de enero a las 15:14

avatar de usuario
Jan Herzán

Después de horas de excavación, finalmente se descubrió por qué sucede esto.

Lo primero es lo primero: Woocommerce guarda el contenido de los fragmentos en sessionStorage dentro del navegador y no lo actualiza hasta que se inserta un nuevo producto en el carrito. Por otro lado, el almacenamiento de sesión se supervisa en busca de cambios, por lo que los fragmentos se actualizan en todas las pestañas (si las hay) al mismo tiempo.

En base a esto, creé una solución fácil que actualiza los fragmentos después de recargar la página y luego actualiza los fragmentos cada minuto.

El javascript necesario para recargar:

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);
});

Lo último es insertar el script en la página con las sustituciones correctas:

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' );
}

Espero que esto ayude a alguien a no pasar todo el día tratando de resolverlo 😉

  • Gracias por señalar que los fragmentos del carrito se almacenan en la sesión y se actualizan al agregar/eliminar elementos del carrito. Modifiqué la plantilla del minicarrito y no podía entender por qué mis cambios no se reflejan en la interfaz. Resulta que solo necesito eliminar un producto.

    – Ziki

    5 de junio de 2019 a las 0:24


En mi caso, solo quería actualizar el carrito una vez para todos mis usuarios, ya que había realizado un cambio significativo en la forma en que se muestran los artículos del carrito. Ir con un script requeriría que lo elimine después de un tiempo (cuando creo que la mayoría de mis usuarios han actualizado sus carritos). Encontré borrar todas las sesiones de Woocommerce existentes yendo a Woocommerce -> Herramientas y haciendo clic en Clear en Borrar sesiones de clientes para que sea más adecuado para mi caso de uso.

¿Ha sido útil esta solución?