如何在购物车页、结账页及订单邮件中显示购物车商品总数?
嘿,你遇到的服务器错误大概率是函数名不匹配导致的——你定义的函数是gh_custom_checkout_field(),但调用的却是my_custom_checkout_field(),这可不就报错嘛!先把这个小问题修正,同时咱们可以把函数优化得更健壮一些,然后一步步在你需要的四个位置显示购物车商品总数:
先替换你原来的函数,这个版本会避免WooCommerce购物车未加载时的错误:
// 计算购物车/订单商品总数的函数 function gh_get_cart_item_count() { // 如果购物车对象不存在(比如订单已创建后),返回0 if ( ! WC()->cart ) { return 0; } return WC()->cart->get_cart_contents_count(); }
下面针对四个场景分别给出实现方法,推荐优先使用钩子(无需修改模板,更安全):
1. 购物车页面显示
方法1:用钩子实现(推荐)
把这段代码加到子主题的functions.php或者自定义插件中,它会在购物车商品列表上方显示数量:
add_action( 'woocommerce_cart_contents_before', 'display_cart_item_count_on_cart' ); function display_cart_item_count_on_cart() { $item_count = gh_get_cart_item_count(); echo '<p class="cart-total-items">购物车商品总数:' . esc_html( $item_count ) . ' 件</p>'; }
你可以根据需求更换钩子(比如woocommerce_cart_before_shipping显示在运费模块前),或者修改HTML的样式类。
方法2:修改购物车模板
如果需要更自定义的位置,复制WooCommerce默认模板cart/cart.php到你的主题目录woocommerce/cart/cart.php,然后在想要的位置插入:
<?php echo '<p>购物车商品总数:' . esc_html( gh_get_cart_item_count() ) . ' 件</p>'; ?>
2. 结账页面显示
方法1:用钩子实现(推荐)
比如在结账表单顶部显示数量:
add_action( 'woocommerce_before_checkout_form', 'display_cart_item_count_on_checkout' ); function display_cart_item_count_on_checkout() { $item_count = gh_get_cart_item_count(); echo '<p class="checkout-total-items">您选购的商品总数:' . esc_html( $item_count ) . ' 件</p>'; }
同样可以更换钩子(比如woocommerce_checkout_before_customer_details显示在客户信息模块前)。
方法2:修改结账模板
复制默认模板checkout/form-checkout.php到主题目录woocommerce/checkout/form-checkout.php,插入函数调用到目标位置:
<?php echo '<p>商品总数:' . esc_html( gh_get_cart_item_count() ) . ' 件</p>'; ?>
3. 客户订单邮件显示
订单创建后购物车会被清空,所以这里要用订单对象获取数量,而不是购物车:
add_action( 'woocommerce_email_order_details', 'display_item_count_in_customer_email', 10, 4 ); function display_item_count_in_customer_email( $order, $sent_to_admin, $plain_text, $email ) { // 只在发送给客户的邮件中显示 if ( $sent_to_admin ) { return; } $item_count = $order->get_item_count(); echo '<p>您的订单商品总数:' . esc_html( $item_count ) . ' 件</p>'; }
这段代码会把数量插入到订单详情模块中。
4. 管理员订单邮件显示
和客户邮件类似,只调整判断条件:
add_action( 'woocommerce_email_order_details', 'display_item_count_in_admin_email', 10, 4 ); function display_item_count_in_admin_email( $order, $sent_to_admin, $plain_text, $email ) { // 只在发送给管理员的邮件中显示 if ( ! $sent_to_admin ) { return; } $item_count = $order->get_item_count(); echo '<p>订单商品总数:' . esc_html( $item_count ) . ' 件</p>'; }
- 所有代码建议加到子主题的
functions.php或者自定义插件中,避免主题更新时丢失修改。 - 确保所有调用都使用正确的函数名
gh_get_cart_item_count(),不要再写错啦!
内容的提问来源于stack exchange,提问作者James Donald

