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

Woodmart主题下为访客显示特定分类商品价格及按钮问题

解决Woodmart主题下访客仅查看指定分类商品价格及隐藏加购按钮问题

核心实现方案

  1. 先定义允许访客查看价格的商品分类(支持ID、别名slug或名称)
  2. 对未登录用户做分类判断:
    • 商品属于允许分类:保留原价格与加购按钮
    • 商品不属于允许分类:替换价格为登录提示,同时隐藏加购按钮
  3. 适配Woodmart主题的自定义钩子,解决默认钩子移除无效的问题

修改后的完整代码

// 允许访客查看价格的商品分类(可填ID、slug或名称,多个用逗号分隔)
define('ALLOWED_VISITOR_CATEGORIES', 'clothing,electronics');

add_filter('woocommerce_get_price_html', 'custom_hide_price_for_visitor_except_categories', 9999, 2);
function custom_hide_price_for_visitor_except_categories($price, $product) {
    // 仅针对未登录用户处理
    if (!is_user_logged_in()) {
        // 获取商品所属分类的slug列表
        $product_categories = wp_get_post_terms($product->get_id(), 'product_cat', array('fields' => 'slugs'));
        // 检查商品是否在允许的分类范围内
        $is_allowed = !empty(array_intersect(explode(',', ALLOWED_VISITOR_CATEGORIES), $product_categories));
        
        if (!$is_allowed) {
            // 替换价格为登录提示
            $price = '<div><a href="' . get_permalink(wc_get_page_id('myaccount')) . '">' . __('Login to see prices', 'bbloomer') . '</a></div>';
            
            // 移除WooCommerce默认加购按钮钩子
            remove_action('woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10);
            remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30);
            
            // 移除Woodmart主题自定义加购按钮钩子(关键适配)
            remove_action('woodmart_after_shop_loop_item', 'woodmart_template_loop_add_to_cart', 10);
            remove_action('woodmart_single_product_add_to_cart', 'woodmart_template_single_add_to_cart', 30);
        }
    }
    return $price;
}

// 额外确保商品列表页加购按钮隐藏(适配Woodmart可能的延迟加载逻辑)
add_action('woocommerce_before_shop_loop_item', 'custom_remove_woodmart_add_to_cart_on_loop', 9);
function custom_remove_woodmart_add_to_cart_on_loop() {
    if (!is_user_logged_in()) {
        global $product;
        $product_categories = wp_get_post_terms($product->get_id(), 'product_cat', array('fields' => 'slugs'));
        $is_allowed = !empty(array_intersect(explode(',', ALLOWED_VISITOR_CATEGORIES), $product_categories));
        
        if (!$is_allowed) {
            remove_action('woodmart_after_shop_loop_item', 'woodmart_template_loop_add_to_cart', 10);
        }
    }
}

代码细节说明

  • ALLOWED_VISITOR_CATEGORIES:替换成你需要开放给访客的分类信息,用逗号分隔多个分类
  • Woodmart主题适配:该主题使用自定义钩子渲染加购按钮,必须移除woodmart_after_shop_loop_item和woodmart_single_product_add_to_cart这两个钩子动作
  • 优先级匹配:remove_action的优先级必须和主题添加动作时的优先级一致(Woodmart默认是10和30)
  • 列表页额外处理:添加woocommerce_before_shop_loop_item钩子,确保延迟加载的商品也能正确隐藏加购按钮

使用注意事项

  1. 将代码添加到主题的functions.php文件或自定义插件中
  2. 测试前清空WooCommerce缓存和浏览器缓存
  3. 若使用分类ID,需将array('fields' => 'slugs')改为array('fields' => 'ids'),同时在ALLOWED_VISITOR_CATEGORIES中填写分类ID

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:10:59