微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP-WooCommerce:标头中的迷你购物车似乎已缓存

我已经把头发扯了两天了,每当我认为解决了它,它就会再次弹出.

在我的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');

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐