我已经把头发扯了两天了,每当我认为解决了它,它就会再次弹出.
在我的header.php中,我有以下代码用于显示购物车中的商品数量,以及一个简单的show / hide 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和实际添加的项目;但是如果我更改页面或刷新,它的默认值将返回0且没有项目.如果我转到购物车,尽管微型购物车仍然说我什么也没有,实际的购物车页面会正确显示购物车中的物品.
仅当我进入购物车页面并从购物车中删除某些内容时,它才会更新.例如,如果我的购物车中实际上有7件商品,但微型购物车显示0,然后从购物车中删除了一个商品,那么微型购物车突然会核心显示6.但是,从那时起,即使是我再添加十几个项目.
这是我尝试过的:
>更改元素的类/ ID(例如,将#minicart更改为#tinycart等)-可以工作一次,然后立即再次开始缓存.
>关闭过滤器:这无效,因为过滤器仅用于添加新项目时返回的片段.还值得注意的是,似乎没有任何一种在页面加载时触发的AJAX调用会干扰微型购物车的显示.
>关闭除WooCommerce之外的所有插件:没有区别.
>在WC设置中关闭“在档案中启用AJAX添加到购物车按钮”功能:这种方法可以正常工作,因为它会在添加项目时重新加载整个页面,并且微型购物车可以正确显示购物车项目的数量(万岁!),但是显然禁用通过AJAX添加项目的功能,这是网站的要求(boo.)
>删除自己的mini-cart.php模板文件:以防万一,看看是否有问题.没什么区别.
>将woocommerce_mini_cart()函数直接放置在其他任何地方:确实如此.如果我使用此函数和echo sprintf(‘%d’,WC()-> cart-> cart_contents_count)行,并将它们放在任何位置-标题内,页面正文内,甚至在获取“缓存”,它们就可以工作.它们显示正确的项目数和正确的项目列表.但是,如上所述,对该函数的其他调用似乎仍被缓存.
如前所述,即使没有其他插件运行,也会发生这种情况.它既发生在本地(在Windows上完全标准的XAMPP安装),又发生在远程(niftier nginx设置,稍新的PHP版本)上,并且都未启用任何类型的缓存.
任何建议都会非常感激,因为我对此完全失去了主意.
解决方法:
有点晚了,但是我尝试了您的代码,并且做了一些小的修改就对我有用.
我已经将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');