
本文详解在自定义 pdf 生成函数中正确获取当前商品 id 的方法,涵盖全局变量失效原因、推荐的参数传递方案及 wc_query 等健壮替代方案,并提供可直接运行的代码示例。
本文详解在自定义 pdf 生成函数中正确获取当前商品 id 的方法,涵盖全局变量失效原因、推荐的参数传递方案及 wc_query 等健壮替代方案,并提供可直接运行的代码示例。
在 WooCommerce 开发中,许多开发者尝试通过 global $product 在自定义函数(如 PDF 生成)中获取当前商品信息,但常遇到 $product 为 null 或未定义的问题。根本原因在于:$product 全局对象仅在 WooCommerce 主题模板(如 single-product.php)或已初始化的产品上下文中才可靠存在;而在插件独立函数、AJAX 回调、后台任务或非产品页面调用时,该全局变量通常未被设置或已被重置。
✅ 正确做法是 显式传递商品 ID 作为函数参数,而非依赖脆弱的全局状态:
function print_gallery_pdf( $product_id = 0 ) {
// 参数校验:确保传入有效整数 ID
if ( ! $product_id || ! is_numeric( $product_id ) ) {
return array();
}
// 使用 WC_Product_Factory 安全获取产品实例(兼容 WC 3.0+)
$product = wc_get_product( $product_id );
if ( ! $product || ! $product->is_type( 'simple' ) && ! $product->is_type( 'variable' ) ) {
return array();
}
$attachment_ids = $product->get_gallery_image_ids();
$link = array();
foreach ( $attachment_ids as $attachment_id ) {
// 注意:'medium' 必须加引号,否则 PHP 将其视为常量
$gallery_image = wp_get_attachment_image( $attachment_id, 'medium' );
if ( $gallery_image ) {
$link[] = $gallery_image; // 推荐使用 [] 替代 array_push() 提升性能
}
}
return $link;
}
? 调用示例:
// 在单产品页面模板中调用(推荐)
if ( is_product() && function_exists( 'print_gallery_pdf' ) ) {
$pdf_images = print_gallery_pdf( get_the_ID() );
}
// 在 AJAX 处理函数中(需前端传 ID)
add_action( 'wp_ajax_generate_pdf', 'handle_pdf_generation' );
function handle_pdf_generation() {
$product_id = intval( $_POST['product_id'] );
$images = print_gallery_pdf( $product_id );
wp_send_json_success( $images );
}
⚠️ 注意事项:
- ❌ 避免依赖 global $product —— 它不是函数作用域安全的“自动上下文”,尤其在插件逻辑中极易失效;
- ✅ 始终验证 $product_id 并使用 wc_get_product()(而非 new WC_Product()),以兼容产品变体、订阅等扩展类型;
- ? 图像尺寸 'medium' 必须为字符串,否则触发 PHP Notice;
- ? 若需在非产品页面(如仪表盘、管理页)获取当前商品,应通过 URL 参数、会话或数据库查询明确指定 ID,切勿假设全局 $product 存在。
总结:将商品 ID 作为必需参数传入函数,是清晰、可靠、可测试且符合 WordPress/WooCommerce 最佳实践的设计方式。 这不仅解决当前问题,更提升代码健壮性与可维护性。











