
本文介绍如何通过钩子函数,在 WooCommerce 结票页面(Cart/Checkout)中,仅为库存状态为“Preorder”的商品自动追加带发布日期的预购提示语,且日期取自产品自定义属性 pa_release。
本文介绍如何通过钩子函数,在 woocommerce 结票页面(cart/checkout)中,仅为库存状态为“preorder”的商品自动追加带发布日期的预购提示语,且日期取自产品自定义属性 `pa_release`。
要实现在结账页(包括购物车和订单确认页)为特定库存状态的商品添加定制化提示,推荐使用 WooCommerce 提供的 woocommerce_cart_item_name 过滤钩子——它允许你在商品名称后安全、精准地插入附加说明,且天然兼容多语言与前端渲染。
以下是一段经过优化的 PHP 代码,可直接添加至当前主题的 functions.php 文件(或您的自定义插件)中:
add_filter('woocommerce_cart_item_name', 'add_preorder_notice_to_cart_items', 10, 3);
function add_preorder_notice_to_cart_items($item_name, $cart_item, $cart_item_key) {
// 检查商品库存状态是否为 'preorder'(注意:WooCommerce 默认值为小写)
if ('preorder' === $cart_item['data']->get_stock_status()) {
// 获取产品对象并读取 pa_release 属性(假设该属性为全局属性,且已赋值)
$product = $cart_item['data'];
$release_date = $product->get_attribute('pa_release');
// 若存在发布日期,则拼接提示;否则可降级显示通用文案
if (!empty($release_date)) {
$notice = sprintf(
'<i style="color:#666; font-size:0.9em; margin-left:8px;">%s (%s)</i>',
__('This is a preorder. Shipping after the release', 'woocommerce'),
esc_html($release_date)
);
} else {
$notice = '<i style="color:#666; font-size:0.9em; margin-left:8px;">' .
__('This is a preorder. Shipping date to be confirmed.', 'woocommerce') .
'</i>';
}
$item_name .= $notice;
}
return $item_name;
}
✅ 关键说明与注意事项:
- pa_release 是 WooCommerce 中产品属性的内部键名,对应前台可见的属性标签如“Release Date”。请确保您已在后台 → 产品 → 自定义属性中创建了名为 release 的属性,并将其设置为“用于产品变体”或“用于目录筛选”,且为每个预购商品正确填写了该属性值。
- 库存状态 'preorder' 需与您在 产品 → 库存 → 库存状态(Stock status) 下拉菜单中实际设置的值严格一致(区分大小写,通常为小写)。若使用自定义库存状态,请确认其注册方式未覆盖默认逻辑。
- 样式采用内联 CSS 确保轻量可控,但如需统一管理外观,建议将样式移至主题样式表(如 style.css),并为提示文本添加专属 class(例如 )。
- 该钩子同时作用于购物车页(/cart)和结账页(/checkout)的商品列表,无需额外适配。
? 进阶建议:
- 如需支持多语言日期格式,可结合 date_i18n() 和 strtotime() 将 pa_release 字符串转为标准化时间再格式化;
- 若 pa_release 存储为 ACF 字段或自定义元字段(如 _release_date),请改用 $product->get_meta('_release_date') 替代 get_attribute();
- 建议配合前端 JS 做二次校验(如禁用预购商品的立即发货选项),以提升用户体验一致性。
通过以上实现,您即可在用户结账过程中清晰传达预购商品的关键履约信息,降低客服咨询压力,同时保持界面简洁专业。










