
本文详解在 WooCommerce 后台产品列表页添加自定义列时,因未正确声明全局变量 $product 导致“Undefined variable: product”错误的成因与修复方案,并提供兼容性更强、更健壮的实现方式。
本文详解在 woocommerce 后台产品列表页添加自定义列时,因未正确声明全局变量 `$product` 导致“undefined variable: product”错误的成因与修复方案,并提供兼容性更强、更健壮的实现方式。
在 WooCommerce 管理后台的产品列表页(edit.php?post_type=product)中,通过 manage_product_posts_custom_column 钩子添加自定义列是常见需求。但许多开发者会误以为 $product 对象在该钩子回调中自动可用——实际上,该钩子仅传入 $column 参数(列标识符),并不传递 $product 或 $post 对象。你当前代码中直接使用未声明的 $product 变量,正是触发 Notice: Undefined variable: product 的根本原因。
此外,$post 全局变量虽在该上下文中通常存在(因页面基于 WordPress 主循环),但 $product 并非 WordPress 默认全局变量,而是 WooCommerce 在特定模板或上下文中(如单产品页)才初始化的对象。因此,不能依赖 global $product 来获取当前产品实例——它在此处为空或未定义。
✅ 正确做法是:通过 wc_get_product( $post->ID ) 显式获取产品对象。这既避免了全局变量陷阱,又确保兼容 WooCommerce 3.0+ 的 CRUD 模型(推荐方式),同时向后兼容旧版本:
// 添加自定义列数据
function woo_product_rmreference_column_data( $column ) {
global $post;
if ( 'rm_reference' !== $column || ! $post ) {
return;
}
// ✅ 安全获取产品对象(兼容 WC 3.0+)
$product = wc_get_product( $post->ID );
if ( ! $product ) {
echo '<div>Not found!</div>';
return;
}
$product_id = $product->get_id();
// 获取 ACF 字段(注意:ACF get_field 第二参数应为 post ID,非 product 对象)
$reference = get_field( 'property_reference', $product_id );
$address = get_field( 'location', $product_id );
// 输出格式化内容
if ( $reference || $address ) {
echo '<div>' . esc_html( $reference ) . ' – ' . esc_html( $address ) . '</div>';
} else {
echo '<div>Not found!</div>';
}
}
add_action( 'manage_product_posts_custom_column', 'woo_product_rmreference_column_data', 10, 1 );? 关键修正说明:
- 移除了对未定义 $product 的依赖,改用 wc_get_product( $post->ID ) 安全构造产品实例;
- 显式校验 $post 和 $product 是否有效,防止空指针异常;
- get_field() 的第二个参数必须是 Post ID(整数),而非对象——你原代码中传 $product_id 是正确的,但前提是 $product_id 已被正确赋值;
- 使用 esc_html() 对输出内容进行转义,增强安全性;
- 钩子参数数量已调整为 1(因 manage_product_posts_custom_column 仅传递一个参数 $column),避免潜在参数错位风险。
⚠️ 注意事项:
- 不要盲目添加 global $product —— 它在此处无意义且可能引发混淆;
- 若需兼容极老版本 WooCommerce(ID ),但强烈建议升级并使用 wc_get_product();
- ACF 字段名(如 'property_reference')需确保已在「Products」自定义字段组中正确配置并启用「Show this field group on」→ 「Product」。
通过以上重构,你的自定义列将稳定显示 ACF 字段值,彻底消除未定义变量警告,并具备良好的可维护性与版本兼容性。

















