WooCommerce如何封装模板PHP代码为函数挂载钩子并正常输出元数据
核心故障原因
封装后的函数无法读取post meta,根源是上下文缺失:
- WooCommerce模板文件中可直接调用
$product对象,是因为模板加载时已经提前全局注入了当前循环的产品实例,自定义钩子回调函数默认没有引入这个全局对象,调用$product->get_id()时无法获取正确的产品ID,自然读不到meta数据 - 原代码用
in_category()判断产品分类,在列表循环的钩子回调中容易出现上下文判定偏差,会导致配件类产品的过滤逻辑失效
可直接部署的完整代码
将以下代码粘贴到Code Snippets插件中替换原有测试代码即可正常运行:
add_action( 'woocommerce_after_shop_loop_item_title', 'display_thc_cbd_markup', 10 ); function display_thc_cbd_markup() { global $product; // 校验产品对象有效性,兼容不同执行场景 if ( ! is_a( $product, 'WC_Product' ) ) { $product = wc_get_product( get_the_ID() ); } if ( ! $product ) return; $product_id = $product->get_id(); // 跳过配件分类产品 if ( has_term( 'accessories', 'product_cat', $product_id ) ) return; $show_range = get_post_meta( $product_id, 'show min max thc cbd', true ); $unit = get_post_meta( $product_id, 'thc/cbd unit', true ); // 输出THC/CBD区间值场景 if ( strpos( $show_range, 'true' ) !== false ) { $min_thc = get_post_meta( $product_id, 'min thc', true ); $max_thc = get_post_meta( $product_id, 'max thc', true ); $min_cbd = get_post_meta( $product_id, 'min cbd', true ); $max_cbd = get_post_meta( $product_id, 'max cbd', true ); ?> <span class="thc_content_wrapper"><?php esc_html_e( 'THC:', 'woocommerce' ); ?> <span class="thc"><?php echo esc_html( $min_thc ); ?><?php esc_html_e( '-', 'woocommerce' ); ?><?php echo esc_html( $max_thc ); ?><?php echo esc_html( $unit ); ?></span> </span> <span class="cbd_content_wrapper"><?php esc_html_e( 'CBD:', 'woocommerce' ); ?> <span class="cbd"><?php echo esc_html( $min_cbd ); ?><?php esc_html_e( '-', 'woocommerce' ); ?><?php echo esc_html( $max_cbd ); ?><?php echo esc_html( $unit ); ?></span> </span> <?php } // 输出THC/CBD单值场景 if ( strpos( $show_range, 'false' ) !== false ) { $thc = get_post_meta( $product_id, 'thc', true ); $cbd = get_post_meta( $product_id, 'cbd', true ); ?> <span class="thc_content_wrapper"><?php esc_html_e( 'THC:', 'woocommerce' ); ?> <span class="thc"><?php echo esc_html( $thc ); ?><?php echo esc_html( $unit ); ?></span> </span> <span class="cbd_content_wrapper"><?php esc_html_e( 'CBD:', 'woocommerce' ); ?> <span class="cbd"><?php echo esc_html( $cbd ); ?><?php echo esc_html( $unit ); ?></span> </span> <?php } }
代码优化说明
- 增加产品对象校验逻辑,优先读取全局
$product,读取失败时自动通过当前文章ID拉取产品实例,兼容单品页、列表页等不同钩子执行场景 - 替换分类判断逻辑为WooCommerce专用的产品分类判定函数
has_term(),避免配件类过滤规则失效 - 所有自定义meta输出前增加HTML转义,符合WordPress开发安全规范
- 重复读取的meta值、产品ID提前存入变量,减少冗余数据库查询
内容的提问来源于stack exchange,提问作者lforsey
相关产品推荐
相关产品推荐

