OneNav主题修改日志-3:首页布局-侧边导航栏菜单 添加 多语言功能

功能模块:左侧边导航栏菜单多语言支持

设置位置:首页布局 → 显示边栏菜单

修改文件数量:2个文件

功能概述

问题背景:站点使用 Polylang 多语言与 OneNav 主题,首页除顶部菜单外还有左侧边栏菜单;后台“外观 → 菜单”只对顶部菜单提供多语言位置,左侧菜单无法随语言切换。

预期目标:切换语言时左侧菜单与首页内容布局同步切换;或在首页模块配置里为每个模块设置“仅在指定语言显示”。

影响范围:首页导航与布局、用户浏览体验、内容可达性与 SEO。

一、修改的文件列表

文件路径 修改内容 修改类型
inc/configs/config-home.php 添加多语言字段配置 新增配置
inc/functions/io-home.php 修改输出函数支持多语言 功能增强

二、配置文件修改

文件:inc/configs/config-home.php

修改 io_get_custom_module_config 添加语言选项

在每个模块类型(search、content、tools、custom)的配置中添加语言选择字段。

编辑 config-home.php,修改 io_get_custom_module_config 函数,添加语言下拉选项。

2.1 添加多语言字段

/**
 * 获取自定义模块配置
 * @param string $loc 模块位置 home:首页,sub:子页面
 * @return array
 */
function io_get_custom_module_config($loc = 'home') {
    return array(
        'id'                     => 'page_module',
        'type'                   => 'repeater',
        'fields'                 => array(
            array(
                'id'      => 'type',
                'type'    => 'button_set',
                'title'   => '模块类型',
                'options' => 'io_custom_module_list',
                'default' => 'content',
            ),
            array(
                'id'      => 'language_filter',
                'type'    => 'select',
                'title'   => '此模块只显示于',
                'options' => 'io_get_language_options', // 自定义语言选项回调
                'default' => 'all', // 默认显示所有语言
                'class'   => 'compact min',
            ),
            io_get_search_config(),
            io_get_content_config(),
            io_get_tools_config($loc),
            io_get_custom_config(),
        ),
        'default'                => array(
            array(
                'type' => 'search',
                'search_config' => array(
                    'search_id' => '',
                    'aside_name' => '',
                )
            )
        ),
        'class'                  => 'fieldset-0 add-custom',
        'sanitize'               => false,
        'button_title'           => '添加模块',
        'accordion_title_number' => true,
    );
}

/**
 * 获取语言选项
 * @return array
 */
function io_get_language_options() {
    $languages = array(
        'all' => '所有',
    );
    if (function_exists('pll_languages_list')) {
        $lang_list = pll_languages_list();
        foreach ($lang_list as $lang) {
            $languages[$lang] = pll__(ucfirst($lang)); // 获取语言名称
        }
    }
    return $languages;
}

说明

  • 添加了 language_filter 字段,类型为 select,位置在模块类型选择之后。
  • io_get_language_options 动态生成选项,包含“所有”以及 Polylang 启用的语言(需安装 Polylang 插件)。
  • default 设置为 all,表示默认显示所有语言。

2.2 修改每个模块的配置字段

  • 确保 search_config、content_config、tools_config 和 custom_config 继承 language_filter 的逻辑。
  • 当前这些字段已在 repeater 内,language_filter 将自动应用于每个模块实例。
示例:检查 io_get_content_config
  • 现有 io_get_content_config 无需额外修改,因为 language_filter 已作为 repeater 的公共字段。

三、输出函数修改

文件:inc/functions/io-home.php

Polylang 提供 pll_current_language() 函数,可用于在渲染时过滤模块。

修改 io-home.php 中的 io_home_content(),添加语言检查。

修改 io-home.php

编辑 io_home_content() 函数:

function io_home_content($config) {
    if (empty($config['page_module'])) {
        return;
    }

    // 初始化 $current_lang,确保始终有值
    $current_lang = 'all';
    if (function_exists('pll_current_language')) {
        $current_lang = pll_current_language() ?: 'all';
    }

    if ($config['aside_show']) {
        // 应用语言过滤
        $modules_to_show = array_filter($config['page_module'], function($module) use ($current_lang) {
            $lang_filter = $module['language_filter'] ?? 'all';
            return $lang_filter === 'all' || $lang_filter === $current_lang;
        });
        io_show_layout_aside($modules_to_show);
    }

    // 显示页面内容模块,应用语言过滤
    $modules_to_show = array_filter($config['page_module'], function($module) use ($current_lang) {
        $lang_filter = $module['language_filter'] ?? 'all';
        return $lang_filter === 'all' || $lang_filter === $current_lang;
    });
    io_show_page_module($modules_to_show);
}

说明

  • 使用 array_filter 过滤只显示匹配当前语言的模块。
  • pll_current_language() 返回当前语言代码(如 zh 或 en),需安装 Polylang。
  • 如果未安装 Pollany,默认为 all。

四、功能特点

  • 多语言分类:每个语言版本可以选择不同的分类组合
  • 自动匹配:根据当前语言自动显示对应的分类筛选
  • 分类多选:每个语言版本可以同时选择多个分类

五、使用方法

  1. 进入 WordPress 后台 → 首页布局显示边栏菜单
  2. 在类型模块栏中 添加了 此模块只显示于(多语言选项)
  3. 选择语言缩写(如:zh、en)
  4. 选择该语言要显示的分类

注意:

  • 需要在”基础设置”中开启”多语言”选项
  • 默认语言建议放在第一位
  • 每个语言版本可以独立选择要显示的分类
  • 建议配合 Polylang 等多语言插件使用,为不同语言创建对应的分类

六、文件修改清单

文件 修改内容 行数(约)
inc/configs/config-home.php 修改 io_get_custom_module_config 添加语言选项 ~60行修改
inc/functions/io-home.php 修改 io-home.php 中的 io_home_content(),添加语言检查 ~25行修改
© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...