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
相关产品推荐
相关产品推荐

