Break out of wordpress filter

时间:2018-06-05 作者:Chris J Allen

我正在使用下面的钩子来循环我的菜单项,并基于某些条件应用一个类。

add_filter( \'nav_menu_css_class\', \'highlight_base_category\', 1, 3 );
Thenav_menu_css_class 过滤器针对每个单独的菜单项运行,但我想在类应用于一个菜单项后完全停止过滤器,以防止多个菜单项具有相同的类。

我一直在考虑设置一个全局布尔值,或者使用一个会话,但这看起来很混乱。

是否有一种方法可以打破当前页面请求的整个过滤器,或者在每次过滤菜单项时设置并检查全局标志?

3 个回复
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网友:Chris J Allen

看起来我只是删除了所述过滤器,然后它将在下一个页面请求中重新连接。

// if matched...
remove_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;
}

结束

相关推荐

Apply_Filters(‘the_content’)-是否使其忽略快捷代码?

我正在使用apply_filters(\'the_content) 因此,我可以在后端的wp编辑器中看到格式正确的内容。但是,这也会呈现内容中的短代码。我希望它忽略短代码,对其余内容进行过滤,基本上与发帖时一样。如果您在后端查看帖子内容,您将看到短代码,但如果您在网站的页面内查看它,您将看到呈现的短代码(其结果)。这可能吗?