【问题标题】:Ajaxify header cart items count in WoocommerceWoocommerce 中的 Ajaxify 标题购物车项目计数
【发布时间】:2018-12-09 22:58:33
【问题描述】:

我正在为 wordpress 创建一个自定义的 woocommerce 集成主题。

我在顶部有一个显示购物车中商品总数的 blob,我想使用 Jquery 更新此 blob(无需重新加载页面)我能够通过获取当前的商品来增加商品数量blob 中的数字并为每次点击增加 +1,问题是添加到购物车有一个选项可以选择要添加到购物车的商品数量。因此,如果我选择 3 个项目并单击按钮,则 blob 只会增加一个。

我可以创建一种方法来获取从前端添加的项目数量,但我认为这是不必要的。我希望能够使用 jquery 从 PHP 会话中获取总数,以便每次单击添加项目或删除项目时,我都会从服务器动态获取当前数字。

到目前为止,我所做的是创建一个 reloadCart.php 文件来回显购物车总数,这是代码

<?php
require('../../../wp-blog-header.php');
global $woocommerce;
echo $woocommerce->cart->get_cart_contents_count();
?>

当我访问此页面时,它会回显当前项目总数,但我无法从 jquery 获取此数据,自从我上次使用 AJAX 以来已经有一段时间了,我也很长时间没有从事网络项目,但我请记住,我所做的 AJAX 调用是正确的。

我尝试过使用 jquery 的 get() 和 post() 函数以及普通的 ajax() 函数,但似乎没有任何效果。有人可以帮忙吗?

$(".ajax_add_to_cart").click(function () {
   /*$("#bag-total").html(function () {
        var bagTotal = parseInt($(this).html());
        return ++bagTotal;
    });*/
    alert('clicked');
    $.get("<?php echo get_template_directory_uri(); ?>/reloadCart.php", function(data){
        alert("Data: " + data);
    });
}); 

注释的行是我之前使用的行,通过从前端获取当前购物车编号来添加购物车总数。

任何帮助将不胜感激。提前致谢!

【问题讨论】:

  • 我有点不清楚,您是否尝试在使用 PHP 收集该值后从 JQuery 中获取该值? echo $woocommerce->cart->get_cart_contents_count(); 还是 reloadCart.php 应该为您提供所需的更新数据? - 第一个代码块的简单解决方案是不直接回显该值,PHP 在加载动态数据时会更改页面,在您的第一个 sn-p 中,您实际上是在回显一行文本;要在 JQuery 中获取它,您只需将文本分配到可选择的

    标记

  • 您确定 "/reloadCart.php" 是您的 php 文件的正确路径并且您的 php 文件没有遇到任何错误吗?您当前收到的警报是什么?
  • 非常确定。当我访问 reloadCart.php 时呈现页面后,它会打印出购物车中当前的商品数量。

标签: php jquery ajax wordpress woocommerce


【解决方案1】:

您不应使用任何重新加载来更新购物车内容计数...相反,您应该使用 Ajax 支持的专用 woocommerce_add_to_cart_fragments 操作挂钩。

1) 要刷新的 HTML: 所以首先在主题的 header.php 文件中,您应该需要将购物车计数嵌入到具有定义的唯一 ID(或类)的特定 html 标记中,例如:

$items_count = WC()->cart->get_cart_contents_count(); 
?>
    <div id="mini-cart-count"><?php echo $items_count ? $items_count : '&nbsp;'; ?></div>
<?php

或:

$items_count = WC()->cart->get_cart_contents_count();

echo '<div id="mini-cart-count"><?php echo $items_count ? $items_count : '&nbsp;'; ?></div>';

2) 代码:

add_filter( 'woocommerce_add_to_cart_fragments', 'wc_refresh_mini_cart_count');
function wc_refresh_mini_cart_count($fragments){
    ob_start();
    $items_count = WC()->cart->get_cart_contents_count();
    ?>
    <div id="mini-cart-count"><?php echo $items_count ? $items_count : '&nbsp;'; ?></div>
    <?php
        $fragments['#mini-cart-count'] = ob_get_clean();
    return $fragments;
}

如果你在你的 html 标签中使用了一个类,你将把 ['#mini-cart-count'] 替换为 ['.mini-cart-count']。这个钩子也用于刷新小车内容。

代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件中。

几年以来global $woocommerce; + $woocommerce-&gt;cart 已经过时并被 WC()-&gt;cart 取代以访问 WooCommerce 购物车对象。


如果您需要 jQuery 来强制刷新该计数,您可以尝试 wc_fragment_refreshwc_fragments_refreshed 委托事件,例如:

$(document.body).trigger('wc_fragment_refresh');

或:

$(document.body).trigger('wc_fragments_refreshed');

【讨论】:

  • 如果购物车是空的,是否可以显示为零?
  • @user9437856 替换 '&amp;nbsp;'by '0'
  • 是的,它正在工作。十分感谢你的帮助。从我这边投票
  • @user9437856 终于好了 :)
【解决方案2】:

对于任何想要正确实现 ajax 的人来说,这里是要走的路。

在functions.php中

add_action('wp_ajax_cart_count_retriever', 'cart_count_retriever');
add_action('wp_ajax_nopriv_cart_count_retriever', 'cart_count_retriever');
function cart_count_retriever() {
    global $wpdb;
    echo WC()->cart->get_cart_contents_count();
    wp_die();
}

在您的脚本文件中(假设您已将脚本文件加入队列并将 ajax 对象传递到脚本中。您还需要将此块放入 setInterval 或其他一些 jquery 操作中。

var data = {
  'action': 'cart_count_retriever'
};
jQuery.post(ajax_object.ajax_url, data, function(response) {
  alert('Got this from the server: ' + response);
});

【讨论】:

  • 我已将脚本放在 count.js 中,并在 functions.php 中排队,但它不起作用。
【解决方案3】:

我以前没有使用过 woocommerce,但是当您在帖子中说时,这是一个非常简单的选择:

当我访问此页面时,它会回显当前项目总数,但我无法从 JQuery 获取此数据

...将使用用户端的 JavaScript 变量进行显示,然后只需调用 PHP 更新方法以使用 AJAX 将商品添加到您的购物车(我没有在下面显示,因为您没有提供该代码)。

<?php
    //hardcoded value for $woocommerce->cart->get_cart_contents_count()
    $woocommerce = 59;
?>
<button class="ajax_add_to_cart">Add to cart</button>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
    //user sided variable for PHP value
    var total = parseInt($(".totalCost").text()); 
    $(".ajax_add_to_cart").click(function(){
        total++;                     //add to cart
        $(".totalCost").text(total); //update
    });
});
</script>

<p class="totalCost">
    <?php echo json_encode($woocommerce); ?>
</p>

您可以在以下位置复制和测试这个 sn-p:http://phpfiddle.org/

基本上在上面的代码中,我将 PHP 值设置为页面加载时的段落文本,然后将该值读入 JS 变量以处理应用程序客户端上的数据,然后更新显示文本如所须。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 2017-04-27
    • 2019-01-31
    • 2018-02-10
    • 1970-01-01
    • 2020-02-28
    相关资源
    最近更新 更多