
本文详解如何在 woocommerce 商品列表页(shop/archive)的自定义钩子函数中安全获取并展示产品价格,解决因语法错误或方法调用不当导致价格无法输出的问题,并提供可直接使用的优化代码。
本文详解如何在 woocommerce 商品列表页(shop/archive)的自定义钩子函数中安全获取并展示产品价格,解决因语法错误或方法调用不当导致价格无法输出的问题,并提供可直接使用的优化代码。
在 WooCommerce 主题开发中,常需通过 woocommerce_after_shop_loop_item 等钩子向商品卡片追加自定义信息(如 ACF 字段)。但许多开发者在调用 $product->get_price() 时遇到价格不显示的问题——根本原因往往不是逻辑错误,而是 PHP 语法陷阱:原代码中 if ( $price = $product->get_price(); ) 多了一个分号(;),导致条件判断失效,语句提前终止,后续 echo 永远不会执行。
✅ 正确写法应为:
if ( $price = $product->get_price() ) {
echo '<p><strong>  </strong> ' . wc_price( $price ) . '</p>';
}
注意三点关键优化:
- 移除多余分号:if 条件语句末尾不可加 ;,否则构成空语句,echo 将脱离条件控制;
- 使用 wc_price() 格式化价格:直接输出 $price(纯数字)会丢失货币符号、千位分隔符和小数精度。推荐使用 WooCommerce 内置函数 wc_price( $price ),它自动适配当前站点货币设置(如 ¥199.00 或 €249,99);
-
增强健壮性:建议检查 $product 实例有效性,避免在非产品上下文(如 Widget 区域)中报错:
if ( ! is_object( $product ) || ! method_exists( $product, 'get_price' ) ) { return; }
完整、健壮且符合 WooCommerce 最佳实践的函数如下:
add_action( 'woocommerce_after_shop_loop_item', 'acf_template_loop_product_meta', 20 );
function acf_template_loop_product_meta() {
global $product;
// 安全校验:确保 $product 是有效 WC_Product 对象
if ( ! is_object( $product ) || ! $product instanceof WC_Product ) {
return;
}
// 输出 ACF 自定义字段(品牌、设计师、型号)
foreach ( ['brand', 'designer', 'model'] as $field ) {
$value = get_field( $field, $product->get_id() );
if ( $value ) {
echo '<p><strong>  </strong> ' . esc_html( $value ) . '</p>';
}
}
// 输出格式化后的产品价格
$price = $product->get_price();
if ( '' !== $price && is_numeric( $price ) ) {
echo '<p><strong>  </strong> ' . wc_price( $price ) . '</p>';
}
}
? 注意事项:
- 始终对 ACF 字段值使用 esc_html() 进行输出转义,防止 XSS 风险;
- wc_price() 已内置本地化处理,无需手动拼接货币符号(原答案中的 ฿ $price 属硬编码,不推荐);
- 若需显示“原价+折后价”(如促销场景),请改用 $product->get_regular_price() 和 $product->get_sale_price() 组合判断。
通过以上修正,您的自定义函数即可稳定、安全、专业地在商品列表页同时呈现 ACF 字段与标准化价格信息。










