php - Ajax 更新 Woocommerce 中购物车菜单上的产品数量

标签 php ajax wordpress woocommerce cart

我有一个菜单项,它指向购物车并读取购物车中当前产品的数量。

CART (3)

当我在购物车页面上更改产品数量并单击“更新购物车” 按钮或删除商品时,数量不会刷新。 知道为什么吗?

/*CHANGE CART MENU TITLE IN MENU*/
add_filter( 'wp_setup_nav_menu_item','my_item_setup' );
function my_item_setup($item) {

    if ( ! is_admin() ) {
        if ( class_exists( 'woocommerce' ) ) {

            global $woocommerce;

            if ( $item->url == esc_url( wc_get_cart_url() ) ) {

                if (is_null($woocommerce->cart)){

                } else {
                    if( get_locale() == 'fr_FR' ) {
                        $item->title = 'PANIER ('. '<span class="count-cart">' .  $woocommerce->cart->get_cart_contents_count() . '</span>)';
                    } else {
                        $item->title = 'MY CART ('. '<span class="count-cart">' .  $woocommerce->cart->get_cart_contents_count() . '</span>)';
                    }
                }

            }
        }
    }
    return $item;
}

add_filter( 'woocommerce_add_to_cart_fragments', 'my_woocommerce_add_to_cart_fragments' );
function my_woocommerce_add_to_cart_fragments( $fragments ) {
    // Add our fragment
    $fragments['li.menu-item-type-woocommerce-cart'] = my_item_setup( '');
    return $fragments;
}

编辑:

使用Ajaxify the cart items count in Woocommerce答案代码,似乎效果更好一些。当我从购物车页面删除商品或更改商品数量时,产品编号会更新,但清空购物车时不会更新。此外,产品编号前后各有一个空格(参见空购物车和“CART ( 1 )” 的图片。

add_filter( 'woocommerce_add_to_cart_fragments', 'wc_refresh_cart_fragments');
function wc_refresh_cart_fragments($fragments){
    ob_start();
    ?>
    <span class="count-cart"><?php echo WC()->cart->get_cart_contents_count(); ?></span>
    <?php
        $fragments['li a span.count-cart'] = ob_get_clean();
    return $fragments;
}

enter image description here

最佳答案

已更新

最好设置一个标签 ID,而不是设置标签 CLASS 来 ajaxify 购物车计数,因为此选择器引用需要是唯一的。如果不是这样,并且存在隐藏的移动重复菜单,则无法工作。

因此,此菜单项在您页面生成的 html 代码中必须是唯一的...如果此菜单项在移动版本中重复,您将需要更改移动代码版本的标签 ID 或标签 CLASS。

我重新审视了你的代码:

add_filter( 'wp_setup_nav_menu_item','my_item_setup' );
function my_item_setup( $item ) {
    if ( ! is_admin() && class_exists( 'woocommerce' ) ) {
        if ( $item->url == esc_url( wc_get_cart_url() ) && ! WC()->cart->is_empty() ){
            $title = get_locale() == 'fr_FR' ? 'PANIER' : 'MY CART';
            $item->title = $title . ' (<span id="count-cart-items">' .  WC()->cart->get_cart_contents_count() . '</span>)';
        }
    }
    return $item;
}

add_filter( 'woocommerce_add_to_cart_fragments', 'wc_refresh_cart_fragments', 50, 1 );
function wc_refresh_cart_fragments( $fragments ){
    $cart_count = WC()->cart->get_cart_contents_count();

    // Normal version
    $count_normal = '<span id="count-cart-items">' .  $cart_count . '</span>';
    $fragments['#count-cart-items'] = $count_normal;

    // Mobile version
    $count_mobile = '<span id="count-cart-itemob">' .  $cart_count . '</span>';
    $fragments['#count-cart-itemob'] = $count_mobile;

    return $fragments;
}

代码位于事件子主题(事件主题)的 function.php 文件中。它应该能更好地工作。

关于php - Ajax 更新 Woocommerce 中购物车菜单上的产品数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53280425/

相关文章:

php - 从数组数组中的每个值填充二维数组

javascript - 在 JQuery ui 自动完成中显示图像

php - Yii中如何正确使用和存储图片

php - 使用 jQuery AJAX 发送 ID 数据

javascript - 收集多个输入文件以附加到 FormData

php - 当没有值重复时重复键输入

javascript - Angular.js - 在其他任何事情之前运行服务功能?

wordpress - 将产品属性添加到古腾堡 Woocommerce 的 block 中

php - 如何在 WordPress 中使用 (NOT IN) OR (IN) using pod

wordpress - Nginx,Wordpress和SQL