Woodmart主题下为访客显示特定分类商品价格及按钮问题
解决Woodmart主题下访客仅查看指定分类商品价格及隐藏加购按钮问题
核心实现方案
- 先定义允许访客查看价格的商品分类(支持ID、别名slug或名称)
- 对未登录用户做分类判断:
- 商品属于允许分类:保留原价格与加购按钮
- 商品不属于允许分类:替换价格为登录提示,同时隐藏加购按钮
- 适配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钩子,确保延迟加载的商品也能正确隐藏加购按钮
使用注意事项
- 将代码添加到主题的
functions.php文件或自定义插件中 - 测试前清空WooCommerce缓存和浏览器缓存
- 若使用分类ID,需将
array('fields' => 'slugs')改为array('fields' => 'ids'),同时在ALLOWED_VISITOR_CATEGORIES中填写分类ID
内容的提问来源于stack exchange,提问作者bilkyroot
相关产品推荐
相关产品推荐

