You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 11:21:19