根据用户登录状态显示/隐藏WooCommerce产品标签问题求助
解决方案
一、原需求正确实现代码
你的代码问题主要有两点:
- 第二个函数逻辑完全颠倒(应在登录时隐藏C、D标签,而非未登录状态)
- 两个过滤器优先级冲突,合并代码时存在语法错误(
else未正确包裹代码块)
将以下代码替换子主题functions.php中的相关代码即可:
add_filter( 'woocommerce_product_tabs', 'customize_product_tabs', 100 ); function customize_product_tabs( $tabs ) { // 未登录用户:隐藏A、B标签,保留C、D if ( ! is_user_logged_in() ) { unset( $tabs['description'] ); // A标签的slug unset( $tabs['suggested-retail'] ); // B标签的slug } // 登录用户:隐藏C、D标签,保留A、B else { unset( $tabs['description-log-in'] ); // C标签的slug unset( $tabs['suggested-retail-log-in'] );// D标签的slug } return $tabs; }
代码说明:
- 确保每个标签的
slug与你实际设置的一致(比如description、suggested-retail对应A、B标签,description-log-in、suggested-retail-log-in对应C、D标签) - 统一用
is_user_logged_in()判断登录状态,比直接调用$current_user更安全可靠 - 单个过滤器函数避免了优先级冲突问题
二、替代需求实现方案(保留A、B标签,未登录隐藏面板内容)
如果原方案遇到问题,可采用此方案:仅保留A、B标签,登录用户查看完整内容,未登录用户看到标签但无法查看面板内的文本。
方法1:通过过滤标签内容实现
add_filter( 'woocommerce_product_tab_content', 'restrict_tab_content_to_logged_in', 10, 3 ); function restrict_tab_content_to_logged_in( $content, $slug, $tab ) { // 针对A、B标签(替换为你的标签slug) if ( in_array( $slug, array( 'description', 'suggested-retail' ) ) && ! is_user_logged_in() ) { // 替换为未登录时显示的提示内容 $content = '<p>请<a href="' . get_permalink( get_option('woocommerce_myaccount_page_id') ) . '">登录</a>查看详细内容</p>'; } return $content; }
方法2:通过CSS隐藏内容(简单快速)
如果不需要动态提示语,可直接用CSS隐藏未登录用户的标签面板内容:
/* 未登录用户隐藏A、B标签的内容 */ body:not(.logged-in) .woocommerce-tabs #tab-description, body:not(.logged-in) .woocommerce-tabs #tab-suggested-retail { display: none; } /* 可选:添加登录提示 */ body:not(.logged-in) .woocommerce-tabs #tab-description::before, body:not(.logged-in) .woocommerce-tabs #tab-suggested-retail::before { content: "请登录查看详细内容"; display: block; padding: 1em; color: #666; }
将上述CSS添加到子主题的自定义CSS面板或style.css文件中即可。
内容的提问来源于stack exchange,提问作者Paigettie
相关产品推荐
相关产品推荐

