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

时间:2015-08-19 12:35:08

标签: php wordpress caching 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&amp; woocommerce_mini_cart())中的标准预处理调用似乎是完全缓存的。如果我添加一个新项目,AJAX将更新两个以显示 1 并添加实际项目;但如果我更改页面或刷新,则默认返回 0 无项目。如果我去购物车,尽管迷你车仍然说我什么都没有,实际购物车页面会正确显示购物车内容。

如果我转到购物车页面并从购物车中删除了某些内容,它似乎只会更新;例如,如果我实际上我的购物车中有7件物品,但是微型车显示0,然后从我的购物车中删除了一件物品,突然间minicart会核心显示6.但是,从那时起将留在6,即使我添加了另外十几项。

这是我尝试过的:

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

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

我会非常感激地收到任何建议,因为我完全忘记了这一点。

1 个答案:

答案 0 :(得分:3)

有点晚了,但我尝试了你的代码,它对我有一些小修改。 我已将 miniart 中的ID更改为 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');