如何仅在WooCommerce产品分类页显示短描述而非超级菜单
解决WooCommerce产品短描述在超级菜单中意外显示的问题
问题场景
在子主题的functions.php中添加代码,原本只想在产品分类页显示产品短描述,但超级菜单(mega menu)里的产品也随之显示了短描述。不想用CSS隐藏的方式,希望仅在分类页的目标位置输出。
原代码如下:
function add_short_description_in_product_categories() { if( is_product_category() ) { global $product; echo '<div itemprop="description">' . apply_filters( 'woocommerce_short_description', $product->get_short_description() ) . '</div>'; } } add_action('woocommerce_after_shop_loop_item_title', 'add_short_description_in_product_categories', 5);
解决思路与方案
方案1:判断是否为主循环(最通用)
超级菜单中的产品通常来自自定义循环,而非页面的主查询循环。通过is_main_query()条件标签,限制代码仅在主循环中执行:
function add_short_description_in_product_categories() { // 仅在产品分类页的主循环中输出短描述 if( is_product_category() && is_main_query() ) { global $product; echo '<div itemprop="description">' . apply_filters( 'woocommerce_short_description', $product->get_short_description() ) . '</div>'; } } add_action('woocommerce_after_shop_loop_item_title', 'add_short_description_in_product_categories', 5);
方案2:标记超级菜单渲染状态
如果方案1无效(部分超级菜单可能仍使用主循环),可以通过钩子标记菜单的渲染状态,避免在菜单中执行代码:
// 标记超级菜单开始渲染 function mark_mega_menu_start() { global $is_in_mega_menu; $is_in_mega_menu = true; } add_action('wp_nav_menu_start', 'mark_mega_menu_start'); // 清除超级菜单标记 function mark_mega_menu_end() { global $is_in_mega_menu; $is_in_mega_menu = false; } add_action('wp_nav_menu_end', 'mark_mega_menu_end'); // 修改原函数,排除超级菜单环境 function add_short_description_in_product_categories() { global $is_in_mega_menu; // 不在超级菜单中,且在产品分类页主循环时输出 if( is_product_category() && is_main_query() && (!isset($is_in_mega_menu) || !$is_in_mega_menu) ) { global $product; echo '<div itemprop="description">' . apply_filters( 'woocommerce_short_description', $product->get_short_description() ) . '</div>'; } } add_action('woocommerce_after_shop_loop_item_title', 'add_short_description_in_product_categories', 5);
方案3:针对特定超级菜单插件适配
如果使用的是知名超级菜单插件(如Max Mega Menu),可以直接利用插件提供的条件判断:
function add_short_description_in_product_categories() { // 排除Max Mega Menu环境 if ( class_exists('Max_Mega_Menu') && Max_Mega_Menu::is_mega_menu() ) { return; } if( is_product_category() && is_main_query() ) { global $product; echo '<div itemprop="description">' . apply_filters( 'woocommerce_short_description', $product->get_short_description() ) . '</div>'; } } add_action('woocommerce_after_shop_loop_item_title', 'add_short_description_in_product_categories', 5);
内容的提问来源于stack exchange,提问作者ColossalYouth
相关产品推荐
相关产品推荐

