这两天我一直为这件事烦恼,每次我以为我已经解决了,它又会跳出来。
在我的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和实际添加的项目;但如果我更改页面或刷新,它默认返回0和No 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');