OneNav主题修改日志-2:博客页分类筛选 添加 多语言功能
功能概述
为”博客页分类筛选”功能添加了多语言支持,使不同语言版本可以显示不同的文章分类筛选选项。每个语言版本可以独立选择要显示的分类。
一、修改的文件列表
| 文件路径 | 修改内容 | 修改类型 |
|---|---|---|
inc/configs/theme/content-post.php |
添加多语言字段配置 | 新增配置 |
template-blog.php |
修改输出函数支持多语言 | 功能增强 |
二、配置文件修改
文件:inc/configs/theme/content-post.php
添加了 blog_index_cat_multi 多语言字段,保留 blog_index_cat 作为单语言版本(向后兼容)。
2.1 添加多语言字段
array(
'id' => 'blog_index_cat_multi',
'type' => 'group',
'title' => '博客页分类筛选(多语言)',
'fields' => array(
array(
'id' => 'language',
'type' => 'text',
'title' => '语言缩写',
'after' => '如:zh en ,各国语言缩写参考',
'class' => 'compact min',
),
array(
'id' => 'categories',
'type' => 'select',
'title' => '选择分类',
'chosen' => true,
'ajax' => true,
'multiple' => true,
'options' => 'categories',
'placeholder' => '搜索并选择文章分类',
'class' => 'compact min',
),
),
'before' => '需在基础设置开启多语言(默认语言放第一个)',
'class' => 'compact min',
'button_title' => '添加语言',
'accordion_title_prefix' => '语言:',
),
2.2 保留单语言版本
array(
'id' => 'blog_index_cat',
'type' => 'select',
'title' => '博客页分类筛选(单语言)',
'chosen' => true,
'ajax' => true,
'multiple' => true,
'options' => 'categories',
'placeholder' => '搜索并选择文章分类',
'after' => ' 如未填写"博客页分类筛选(多语言)",则使用此选项(向后兼容)',
'dependency' => array('blog_index_cat_multi', '==', ''),
),
三、输出函数修改
文件:template-blog.php
修改了 get_ajax_load_posts() 函数,支持根据当前语言自动显示对应的分类筛选。
重要:由于
io_get_option 会对包含 multi 的字段自动处理,导致无法获取完整数组。解决方案是直接从数据库获取原始数据。function get_ajax_load_posts()
{
// 直接从数据库获取原始数据,跳过_iol函数的自动处理
$options = get_option('io_get_option');
$blog_index_cat_multi = isset($options['blog_index_cat_multi']) ? $options['blog_index_cat_multi'] : '';
$blog_index_cat = io_get_option('blog_index_cat', '');
$cats = array();
if (!empty($blog_index_cat_multi) && is_array($blog_index_cat_multi)) {
// 使用多语言版本
$current_lang = determine_locale();
$lang_code = explode('_', $current_lang)[0];
$found = false;
// 查找当前语言对应的分类
foreach ($blog_index_cat_multi as $item) {
if (isset($item['language'])) {
$item_lang = $item['language'];
if ($item_lang == $current_lang || $item_lang == $lang_code) {
$cats = isset($item['categories']) && is_array($item['categories']) ? $item['categories'] : array();
$found = true;
break;
}
}
}
// 如果没有找到匹配的语言,使用第一个作为默认
if (!$found && !empty($blog_index_cat_multi[0])) {
$cats = isset($blog_index_cat_multi[0]['categories']) && is_array($blog_index_cat_multi[0]['categories']) ? $blog_index_cat_multi[0]['categories'] : array();
}
} else {
// 使用单语言版本(向后兼容)
$cats = is_array($blog_index_cat) ? $blog_index_cat : array();
}
if (empty($cats))
return;
$cat = __post('cat');
$active = $cat ? '' : 'active';
$link = get_permalink();
$html = '
';
$html .= '' . __('最新文章', 'i_theme') . '';
foreach ($cats as $value) {
$active = $cat == $value ? 'active' : '';
$link = add_query_arg('cat', $value, $link);
$html .= '' . get_cat_name($value) . '';
}
$html .= '
';
return $html;
}
四、功能特点
- 多语言分类:每个语言版本可以选择不同的分类组合
- 自动匹配:根据当前语言自动显示对应的分类筛选
- 向后兼容:保留单语言版本,不影响现有配置
- 分类多选:每个语言版本可以同时选择多个分类
五、使用方法
- 进入 WordPress 后台 → 主题设置 → 内容页面 → 文章博客
- 找到 博客页分类筛选(多语言)
- 点击 添加语言 按钮
- 填写语言缩写(如:zh、en)
- 选择该语言要显示的分类(支持多选)
- 重复步骤3-5,添加更多语言版本
- 保存设置
注意:
- 需要在”基础设置”中开启”多语言”选项
- 默认语言建议放在第一位
- 每个语言版本可以独立选择要显示的分类
- 建议配合 Polylang 等多语言插件使用,为不同语言创建对应的分类
六、技术说明
6.1 数据处理方式
由于 io_get_option() 函数会对包含 multi 的字段通过 _iol() 函数自动处理,返回当前语言对应的字符串而不是完整数组。因此需要直接从数据库获取原始数据:
// 直接从数据库获取原始数据,跳过_iol函数的自动处理
$options = get_option('io_get_option');
$blog_index_cat_multi = isset($options['blog_index_cat_multi']) ? $options['blog_index_cat_multi'] : '';
6.2 语言匹配逻辑
代码会根据当前语言自动匹配对应的分类列表:
- 首先尝试完全匹配(如:
zh_CN匹配zh_CN) - 其次尝试语言代码匹配(如:
zh_CN匹配zh) - 如果都没有匹配到,使用第一个语言版本作为默认值
七、文件修改清单
| 文件 | 修改内容 | 行数(约) |
|---|---|---|
inc/configs/theme/content-post.php |
添加blog_index_cat_multi多语言字段配置 | ~30行新增 |
template-blog.php |
修改get_ajax_load_posts()函数支持多语言 | ~50行修改 |
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...