我正在尝试覆盖WordPress的默认参数wp_nav_menu
函数,同时仍然允许程序员传递自己的参数。这个wp_nav_menu_args
过滤器似乎是完美的解决方案,但它们是一个陷阱。函数如下所示:
function my_nav_menu_args( $args = \'\' ) {
// my code here
return $args;
}
add_filter( \'wp_nav_menu_args\', \'my_nav_menu_args\' );
问题是
$args
包含函数调用的参数
or WordPress\' default arguments. 因此,如果
wp_nav_menu
is调用没有任何参数
$args
如下所示:
array(
\'menu\' => \'\',
\'container\' => \'div\',
\'container_class\' => \'\',
\'container_id\' => \'\',
\'menu_class\' => \'menu\',
\'menu_id\' => \'\',
\'echo\' => true,
\'fallback_cb\' => \'wp_page_menu\',
\'before\' => \'\',
\'after\' => \'\',
\'link_before\' => \'\',
\'link_after\' => \'\',
\'items_wrap\' => \'<ul id="%1$s" class="%2$s">%3$s</ul>\',
\'depth\' => 0,
\'walker\' => \'\',
\'theme_location\' => \'\'
)
这意味着我不能简单地检查某个参数是否为空,以便知道在哪里或不应用我自己的默认值。还有
wp_parse_args
函数,用于将参数与您自己的默认值合并。但是,在这种情况下,这不起作用:
$defaults = array(
\'container\' => false
);
$args = wp_parse_args( $args, $defaults );
$args[\'container\']
仍将是WordPress的默认值
\'div\'
而不是
false
.
我知道$args[\'container\'] = false
将正确设置参数,但任何设置container
参数将被忽略。
我能考虑的唯一解决方案是对照WordPress硬编码的默认参数检查每个参数。检查container
参数如下所示:
function my_nav_menu_args( $args = \'\' ) {
if ( $args[\'container\'] == \'div\' ) {
$args[\'container\'] = false;
}
return $args;
}
add_filter( \'wp_nav_menu_args\', \'my_nav_menu_args\' );
这是可行的,但我认为必须有一个更简单的解决方案,不需要硬编码默认值。