我正在使用下面的钩子来循环我的菜单项,并基于某些条件应用一个类。
add_filter( \'nav_menu_css_class\', \'highlight_base_category\', 1, 3 );
The
nav_menu_css_class
过滤器针对每个单独的菜单项运行,但我想在类应用于一个菜单项后完全停止过滤器,以防止多个菜单项具有相同的类。
我一直在考虑设置一个全局布尔值,或者使用一个会话,但这看起来很混乱。
是否有一种方法可以打破当前页面请求的整个过滤器,或者在每次过滤菜单项时设置并检查全局标志?
SO网友:Krzysiek Dróżdż
是的,有这样的方式。您只需在其中注销过滤器:
function highlight_base_category( $classes, $item, $args ) {
// most probably you have some if statement here
if ( /* YOU CONDITION */ ) {
// your code
remove_filter( \'nav_menu_css_class\', \'highlight_base_category\', 1 );
}
return $classes;
}
add_filter( \'nav_menu_css_class\', \'highlight_base_category\', 1, 3 );
SO网友:Nathan Johnson
除了ChrisJ Allen的回答之外,如果您想删除所有过滤器,包括插件/主题未添加的过滤器,您可以使用remove_all_filters()
而不是remove_filter()
.
add_filter( \'nav_menu_css_class\', \'wpse_nav_menu_css_class\', 1, 4 );
function wpse_nav_menu_css_class( $classes, $item, $args, $depth ) {
//* Do something useful to the nav menu CSS class
$classes[] = \'highlight\';
//* Make sure no other filters modify the classes
remove_all_filters( \'nav_menu_css_class\' );
return $classes;
}