给wordpress每个页面设置制定的菜单导航


需要开发定制:定制wordpress插件


记录最近制作外贸站遇到的问题

在制作Wordpress多语言页面的时候,如果不使用翻译插件,又想使用系统自带的选单就需要为每一个页面自定义选单了。

需求是什么?

1.指定语言页面。
2.指定语言选单。
3.选单切换导航的时候更换指定语言页面。

写一个WP插件来实现它

PHP

 'Header Menu'
    );

    foreach ($menu_positions as $position_key => $position_label) {
        add_meta_box(
            'custom-menu-selector-' . $position_key,
            'Custom Menu Selector - ' . $position_label,
            'custom_menu_selector_callback',
            'page',
            'side',
            'high',
            array('position' => $position_key)
        );
    }
}

// 输出到当前站点的菜单列表wp页面里面(根据语言提前设置好多个语言的选单)
function custom_menu_selector_callback($post, $metabox)
{
    $position = $metabox['args']['position'];
    $selected_menu = get_post_meta($post->ID, '_custom_menu_' . $position, true);
    $menus = get_terms('nav_menu', array('hide_empty' => false));

    echo '';
    echo '';
    wp_nonce_field('custom_menu_positions_nonce', 'custom_menu_positions_nonce');
}

// 保存页面的时候,把设置的菜单类型保存到帖子里
add_action('save_post', 'save_custom_menu_positions');

function save_custom_menu_positions($post_id)
{
    // Check if nonce is set
    if (!isset($_POST['custom_menu_positions_nonce']) || !wp_verify_nonce($_POST['custom_menu_positions_nonce'], 'custom_menu_positions_nonce')) {
        return;
    }

    // 存储到meta信息里
    $menu_positions = array('header_menu');

    foreach ($menu_positions as $position) {
        if (array_key_exists($position, $_POST['menu-locations'])) {
            update_post_meta($post_id, '_custom_menu_' . $position, sanitize_text_field($_POST['menu-locations'][$position]));
        }
    }
}


// 页面在切换导航的时候,更新当前设置的选单。
add_action('template_redirect', 'update_primary_menu');

function update_primary_menu()
{
    
    $post_id = get_queried_object_id();

    $header_menu = get_post_meta($post_id, '_custom_menu_header_menu', true);
    //这里默认选择主选单
    $primary_menu_location = 'primary'; // Identifier for 
    $menu_locations = get_nav_menu_locations();

    if (isset($menu_locations[$primary_menu_location])) {

        $primary_menu_id = $menu_locations[$primary_menu_location];
        $selected_menu_id = $header_menu ? $header_menu : $primary_menu_id;

       //设置全局选单
        set_theme_mod('nav_menu_locations', array('primary' => $selected_menu_id));

    }
}

如何使用?

将这段代码复制到主题的function里面就可以了,也可以制作成wp插件安装使用,当然为了防止修改错误,你可以安装wpCode插件后自定义一个代码段,把这个放进去就可以了。

插件已开源:wp-custom-page-menu-selector


文章作者: 2winter
文章链接: https://2winter.com
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 2winter !