WooCommerce:标题中的迷你购物车似乎被缓存了



这两天我一直为这件事烦恼,每次我以为我已经解决了,它又会跳出来。

在我的header.php中,我有以下代码用于显示购物车中的项目数量,以及一个简单的显示/隐藏div显示项目本身,以及总数:

<a id="miniart" href="<?php echo WC()->cart->get_cart_url(); ?>" class="cart icon red relative">
    <div class="number bold">
        <?php echo sprintf('%d', WC()->cart->cart_contents_count); ?>
    </div>
    <div>
        <?php returnIcon('cart');   // This function simply displays an inline SVG  ?>
    </div>
    <div id="cartcontents">
        <div class="widget_shopping_cart_content">
            <?php woocommerce_mini_cart(); ?>
        </div>
    </div>
</a>

我还有一个过滤器,当添加新项目时通过AJAX返回购物车片段:

function woocommerce_header_add_to_cart_fragment($fragments) {
    ob_start();
    ?>
        <div class="number bold">
            <?php echo sprintf('%d', WC()->cart->cart_contents_count); ?>
        </div>
    <?php
    $fragments['#minicart .number'] = ob_get_clean();
    return $fragments;
}
add_filter('woocommerce_add_to_cart_fragments', 'woocommerce_header_add_to_cart_fragment');

过滤器总是有效-我从来没有遇到过问题。什么是完全扔我是标准的,在头(cart_contents_count &woocommerce_mini_cart())似乎完全缓存。如果我添加一个新项目,AJAX将更新以显示1和实际添加的项目;但如果我更改页面或刷新,它默认返回0No items。如果我去购物车,尽管迷你购物车仍然说我什么都没有,但是实际的购物车页面会正确显示购物车的内容。

只有当我进入购物车页面并从购物车中删除某些内容时,它才会更新;例如,如果我的实际上购物车中有7件商品,但迷你购物车显示0,然后从购物车中删除一件商品,突然迷你购物车将正确显示6。然而,从这一点开始,它将保持为6,即使我再添加12个项目。

这是我尝试过的:

  • 更改元素的类/id (i,e, #minicart#tinycart等)-工作一次,然后立即开始缓存再次
  • 关闭过滤器:这没有效果,因为过滤器只用于在添加新项时返回片段。同样值得注意的是,在页面加载时似乎没有触发任何AJAX调用,这将干扰mini - art显示。
  • 关闭除WooCommerce以外的所有插件:没有影响
  • 在WC设置中关闭"启用AJAX添加到购物车按钮上的存档":这个kinda工作,只要它在添加项目时重新加载整个页面,并且迷你艺术正确显示购物车项目的数量(hooray!),但显然禁用了通过AJAX添加项目的能力,这是网站的要求(boo.)
  • 删除我自己的mini-cart.php模板文件:以防万一,看看这是否是个问题。
  • woocommerce_mini_cart()函数放在其他任何地方:这,令人恼火的是,工作。如果我把这个函数和echo sprintf('%d', WC()->cart->cart_contents_count)行,并把它们任何地方 -在标题内,在页面正文内,甚至在相同的元素,得到"缓存",他们的工作。它们显示正确的项目数量和正确的项目列表。但是,如上所述,对该函数的其他调用似乎仍然被缓存。

如前所述,即使没有其他插件运行,也会发生这种情况;它在本地(Windows上完全标准的XAMPP安装)和远程(一个更漂亮的nginx设置,稍微更新的PHP版本)都可以发生,并且都没有启用任何类型的缓存。

任何建议都将非常感激,因为我已经完全失去了我的头脑。

有点晚了,但我尝试了你的代码,它为我工作了一些小的修改。我已经将a id从miniart更改为minicart,并注释掉了returnIcon

<a id="minicart" href="<?php echo WC()->cart->get_cart_url(); ?>" class="cart icon red relative">
                    <div class="number bold">
                        <?php echo sprintf('%d', WC()->cart->cart_contents_count); ?>
                    </div>
                    <div>
                        <?php //returnIcon('cart');   // This function simply displays an inline SVG  ?>
                    </div>
                    <div id="cartcontents">
                        <div class="widget_shopping_cart_content">
                            <?php woocommerce_mini_cart(); ?>
                        </div>
                    </div>
                </a>

另一个更改是将woocommerce_header_add_to_cart_fragment重命名为wif_woocommerce_header_add_to_cart_fragment

    function wif_woocommerce_header_add_to_cart_fragment($fragments) {
    ob_start();
    ?>
    <div class="number bold">
        <?php echo sprintf('%d', WC()->cart->cart_contents_count); ?>
    </div>
    <?php
    $fragments['#minicart .number'] = ob_get_clean();
    return $fragments;
}
add_filter('woocommerce_add_to_cart_fragments', 'wif_woocommerce_header_add_to_cart_fragment');

最新更新