根据页面ID(或父ID)使用不同的wp_NAV_MENU Theme_Location

时间:2015-04-10 作者:Keefer

我肯定有人问过这个问题。这对我来说是一个新领域,所以我对我正在做的事情没有完整的词汇,我也不确定这是正确的方式。

我在一个网站上有一堆内部页面,页面之间唯一真正的变化是侧边栏div中的第三导航(显然是主要内容区域)。

我已经为wp\\U nav\\U菜单设置了许多主题位置。基于页面ID或父ID或类似的内容显示它们的最佳方式是什么?

我找到了一些类似的东西,但并不完全是我所需要的:

<?php
    $thispageid = get_the_ID();
    if( $thispageid == "1" ) )
        wp_nav_menu( array( \'theme_location\' => \'tertiary_surgeons_consulting\' ) );
    if( $thispageid == "2" ) )
        wp_nav_menu( array( \'theme_location\' => \'tertiary_surgeons_consulting\' ) ); 
    else
        wp_nav_menu( array( \'theme_location\' => \'tertiary_surgeons_education\' ) );
?>
这个思维过程是实现这一目标的正确方式,还是我错过了WordPress中已有的其他方式?

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

最好的解决方案是允许用户在添加/编辑页面时选择导航菜单位置。使用带有下拉列表(select)的元框,选择所有可用位置,然后将所选位置保存在自定义字段中:

/**
 * Register the meta box.
 */
function wpse_183868_page_nav_menu_meta_box_register() {
    add_meta_box(
        \'wpse_183868_page_nav_menu\',
        \'Nav Menu\',
        \'wpse_183869_page_nav_menu_meta_box\',
        \'page\',
        \'side\'
    );
}

add_action( \'add_meta_boxes\', \'wpse_183868_page_nav_menu_meta_box_register\' );

/**
 * Display the meta box.
 */
function wpse_183869_page_nav_menu_meta_box( $post ) {
    $selected = get_post_meta( $post->ID, \'_page_nav_menu\', true );
    wp_nonce_field( \'save\', \'page_nav_menu_nonce\' );
    ?>

<select name="page_nav_menu">
    <?php foreach ( get_registered_nav_menus() as $name => $label ) : ?>
         <option value="<?php echo $name ?>"<?php selected( $name, $selected ) ?>><?php echo $label ?></option>
    <?php endforeach ?>
</select>

<?php
}

/**
 * Save the meta box data.
 */
function wpse_183869_page_nav_menu_save( $post_id ) {
    if ( ! isset( $_POST[\'page_nav_menu\'], $_POST[\'page_nav_menu_nonce\'] ) || ! wp_verify_nonce( $_POST[\'page_nav_menu_nonce\'], \'save\' ) )
        return;

    $nav_menus = get_registered_nav_menus();
    $nav_menu = $_POST[\'page_nav_menu\'];

    if ( isset( $nav_menus[ $nav_menu ] ) ) // Paranoid - check the submitted value is definitely valid
        update_post_meta( $post_id, \'_page_nav_menu\', $nav_menu );
}

add_action( \'save_post\', \'wpse_183869_page_nav_menu_save\' );
现在,您可以在模板中使用:

if ( ! $page_nav_menu = get_post_meta( get_the_ID(), \'_page_nav_menu\', true ) )
    $page_nav_menu = \'default_location\';

wp_nav_menu( array( \'theme_location\' => $page_nav_menu ) );

结束

相关推荐

注册_NAV_MENUS,然后以编程方式创建菜单

我有一个register_nav_menus 调用我的主题函数。php://register nav menu and footer nav. register_nav_menus( array( \'main-nav\' => \'Main Navigation\', \'footer-nav\' => \'Footer Navigation\' ) ); 这很好,但我想采取额外的步