所以,我一直在尝试编写一个插件,我需要使用\'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\'
滤器
最合适的回答,由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 查看我如何使用此选项来确定要使用哪个过滤器