覆盖wp_NAV_MENU默认参数

时间:2013-10-18 作者:Spencer

我正在尝试覆盖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\' );
这是可行的,但我认为必须有一个更简单的解决方案,不需要硬编码默认值。

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

如果希望开发人员可以扩展这些选项,只需向输出中添加一个自定义过滤器:

wp_nav_menu( apply_filters( \'wpse119371_nav_menu_args\', array(
    \'theme_location\' => \'primary\',
    \'container\' => false,
    // etc.
) ) );
然后,开发人员只需添加一个过滤器回调:

function wpse119371_filter_nav_menu_args( $args ) {
    // Modify $args
    $args[\'container\'] => \'div\';
    // etc.

    // Return
    return $args;
}
add_filter( \'wpse119371_nav_menu_args\', \'wpse119371_filter_nav_menu_args\' );

结束

相关推荐

Menus like a CMS

以下是一些内容的结构示例:Parent A -- Child A -- Child B Parent B -- Child C -- Child D Parent A 应链接到的内容Child A 和Parent B 应链接到的内容Child C. 除此之外,我不确定这是否应该完全由wordpress中的“菜单”来管理,或者它是否应该是Parent A 包含子页面的页面。唯一的问题是Parent A 不是真正的内容,只是链接到Child A.如果你需要一个真