某些导航菜单过滤器不执行任何操作

时间:2016-03-08 作者:Codesmith

所以,我一直在尝试编写一个插件,我需要使用\'nav_menu_link_attributes\' 滤器我尝试添加过滤器,但根本没有响应。也就是说,我让它在调用过滤器的过程中死去。

...
# in class definition

public function __construct() {
    add_filter(\'wp_nav_menu_objects\',array($this,\'filter_menuitem\'));
}

public function filter_menuitem($attrs) {
    die(\'SUCCESS!!!\');
}

...
我查看了来源nav-menu-template.php 查看为什么以及何时调用什么过滤器。因此,我尝试使用以下过滤器,一次一个,按照它们在源代码中出现的顺序;有些成功了,有些根本没有反应:

function wp_nav_menu() {
  wp_nav_menu_args                   Responded
  pre_wp_nav_menu                    Responded
  wp_nav_menu_container_allowedtags  Did not respond - not a surprise
  wp_nav_menu_objects                Did not respond - should definitely have responded
  wp_nav_menu_items                  Did not respond - should definitely have responded
  wp_nav_menu                        Did not respond - should definitely have responded
}
唯一有意义的是\'pre_wp_nav_menu\' 可用于生成自定义菜单,跳过调用以下过滤器的WP default方法。但我试着使用了3个不同的主题,我不希望经常出现这种情况,甚至永远不会出现这种情况。

我错过什么了吗?这是WordPress的bug吗?自定义菜单生成真的那么常见吗?

Details:
WordPress 4.4.2测试主题:优雅主题Divi 2.4.6.1、213、215插件:只有我自己的,没有一个使用\'pre_wp_nav_menu\' 滤器

ANSWER:
所以,在彼得·古森的回答中,我查找了wp_nav_menu 函数,并找到\'wp_page_menu\' 在组成完整HTML代码(无换行符;包括包装器)后调用的过滤器。对于我正在做的内容来说,这已经足够了,在挂钩和测试之后,我发现它是有效的!

我还发现\'wp_list_pages\' 过滤器也可以工作。它只列出了<li> 用换行符分隔的标记。不包括包装,甚至<ul> 标签然而,我对使用此功能的其他功能持怀疑态度。不能仅为菜单调用它。因此,为了安全起见,最好还是坚持\'wp_page_menu\' 滤器

1 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

这与fallback_cb 中的参数wp_nav_menu(). 大多数导航菜单不设置此参数,因此使用默认值,即wp_page_menu.

如果您查看wp_nav_menu(), 没有fallback_cb 设置(解除)wp_page_menu),您将看到执行以下代码行

if ( ( !$menu || is_wp_error($menu) || ( isset($menu_items) && empty($menu_items) && !$args->theme_location ) )
    && isset( $args->fallback_cb ) && $args->fallback_cb && is_callable( $args->fallback_cb ) )
        return call_user_func( $args->fallback_cb, (array) $args );
此代码用于卸载wp_page_menu(). 此代码在pre_wp_nav_menu 过滤器,这就是为什么您看到此过滤器执行的原因。这几行之后的所有筛选器都不会执行,因为wp_nav_menu() 现在已加载wp_page_menu().

如果您现在测试内部的过滤器wp_page_menu(), 你会看到他们按预期开火。

你可以看看my answer here 查看我如何使用此选项来确定要使用哪个过滤器

相关推荐

Custom items for Menus

编辑菜单时,我发现可以添加5种类型的项目:自定义链接页面帖子类别标签是否可以添加自定义的?比如说,我想添加一个图像,或者一个搜索栏,或者其他什么。我是否可以添加新的菜单项类型,以呈现我为它们选择的代码?