gpt4 book ai didi

php - WooCommerce: header 中的迷你购物车似乎已缓存

转载 作者:搜寻专家 更新时间:2023-10-31 20:37:16 25 4
gpt4 key购买 nike

两天来我一直在为这个问题焦头烂额,每次我认为我已经解决了它,它就会再次弹出。

在我的 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 返 repo 物车片段:

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

过滤器始终有效——我从来没有遇到过这个问题。完全让我感到震惊的是 header 中的标准预处理调用(cart_contents_count & woocommerce_mini_cart())似乎完全被缓存了。如果我添加一个新项目,AJAX 将同时更新以显示 1 和实际添加的项目;但如果我更改页面或刷新,它默认返回到 0无项目。如果我去我的购物车,尽管迷你购物车仍然说我什么都没有,实际购物车页面会正确显示购物车内容。

只有当我转到我的购物车页面并从我的购物车中删除一些东西时,它才会更新;例如,如果我的购物车实际上有 7 件商品,但微型购物车显示 0,然后从我的购物车中删除一件商品,微型购物车突然会正确显示 6。但是,从那时起它将保持在 6,即使我再添加十几个项目。

这是我尝试过的:

  • 更改元素的类/ID(例如,#minicart#tinycart 等)- 一次有效,然后立即再次开始缓存。
  • 关闭过滤器:这没有任何效果,因为过滤器仅用于在添加新项目时返回片段。另外值得注意的是,似乎没有任何类型的 AJAX 调用在页面加载时触发,这会干扰微型购物车的显示。
  • 关闭除 WooCommerce 之外的所有插件:没有任何区别。
  • 在 WC 设置中关闭“在存档上启用 AJAX 添加到购物车按钮”:有点 有效,因为它会在添加项目时重新加载整个页面,并且微型购物车正确显示了购物车商品的数量(万岁!),但显然禁用了通过 AJAX 添加商品的能力,这是网站的要求(嘘。)
  • 删除我自己的 mini-cart.php 模板文件: 以防万一,看看这是否是一个问题。没有区别。
  • woocommerce_mini_cart() 函数直接放在其他任何地方:令人愤怒的是,这有效。如果我使用此函数和 echo sprintf('%d', WC()->cart->cart_contents_count) 行并将它们放在任何地方 - 在标题中,在页面正文,即使在正在“缓存”的相同元素中,它们也能正常工作。它们显示正确的项目数量和正确的项目列表。但如上所述,对该函数的其他调用似乎仍被缓存。

如前所述,即使没有其他插件运行也会发生这种情况;它发生在本地(在 Windows 上完全标准的 XAMPP 安装)和远程(更漂亮的 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');

关于php - WooCommerce: header 中的迷你购物车似乎已缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32095685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com