OneNav主题修改日志-3:首页布局-侧边导航栏菜单 添加 多语言功能
功能概述
问题背景:站点使用 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。
四、功能特点
- 多语言分类:每个语言版本可以选择不同的分类组合
- 自动匹配:根据当前语言自动显示对应的分类筛选
- 分类多选:每个语言版本可以同时选择多个分类
五、使用方法
- 进入 WordPress 后台 → 首页布局 → 显示边栏菜单
- 在类型模块栏中 添加了 此模块只显示于(多语言选项)
- 选择语言缩写(如:zh、en)
- 选择该语言要显示的分类
注意:
- 需要在”基础设置”中开启”多语言”选项
- 默认语言建议放在第一位
- 每个语言版本可以独立选择要显示的分类
- 建议配合 Polylang 等多语言插件使用,为不同语言创建对应的分类
六、文件修改清单
| 文件 | 修改内容 | 行数(约) |
|---|---|---|
inc/configs/config-home.php |
修改 io_get_custom_module_config 添加语言选项 | ~60行修改 |
inc/functions/io-home.php |
修改 io-home.php 中的 io_home_content(),添加语言检查 | ~25行修改 |
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...