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

WooCommerce单品页根据自定义字段值显示指定文本的实现问题

解决WooCommerce单品页自定义文本显示问题

嘿,我来帮你搞定这个需求!你之前的SQL查询主要有两个问题:一是表名写法错误,二是没关联当前产品的ID,导致没法精准获取对应产品的元字段值。下面给你两种靠谱的解决方案:

方案一:用WordPress原生函数(更推荐,安全又省心)

直接用WordPress自带的get_post_meta()获取元字段值,不用自己写SQL,避免出错:

function show_price_visibility_text() {
    // 只在单品页执行,避免无效触发
    if ( ! is_product() ) return;

    $post_id = get_the_id();
    // 获取当前产品的'show'元字段值
    $show_text = get_post_meta( $post_id, 'show', true );

    // 满足条件:元字段值为'yes',且用户未登录时显示文本
    if ( $show_text === 'yes' && ! is_user_logged_in() ) {
        echo '<p class="price-visibility-note">price only visible for logged in users</p>';
    }
}
// 把文本添加到单品页价格区域附近,优先级15会显示在价格之后,可按需调整
add_action( 'woocommerce_single_product_summary', 'show_price_visibility_text', 15 );

方案二:修正你的SQL查询写法

如果坚持用$wpdb查询,要注意表名的正确格式($wpdb->postmeta已经包含了表前缀,不用额外加wp_),同时必须指定当前产品的ID:

function show_price_visibility_text() {
    global $wpdb;
    // 仅在单品页执行
    if ( ! is_product() ) return;

    $post_id = get_the_id();
    // 用prepare方法防止SQL注入,同时精准匹配当前产品的元字段
    $show_text = $wpdb->get_var( $wpdb->prepare(
        "SELECT meta_value FROM $wpdb->postmeta WHERE post_id = %d AND meta_key = %s",
        $post_id,
        'show'
    ) );

    // 满足条件时输出提示文本
    if ( $show_text === 'yes' && ! is_user_logged_in() ) {
        echo '<p class="price-visibility-note">price only visible for logged in users</p>';
    }
}
add_action( 'woocommerce_single_product_summary', 'show_price_visibility_text', 15 );

额外说明:

  • is_product()确保函数只在单品页运行,避免在其他页面做无用功
  • get_the_id()在单品页能正确获取当前产品ID,因为单品页处于单个产品的循环上下文里
  • 给提示文本加了price-visibility-note类名,方便你用CSS自定义样式(比如调整颜色、字体大小)
  • 钩子优先级15的位置刚好在产品价格之后,你可以通过修改数字调整显示位置(数字越小越靠前)

内容的提问来源于stack exchange,提问作者Tuxy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:23:25