OneNav主题修改日志-2:博客页分类筛选 添加 多语言功能

功能模块:博客页分类筛选多语言支持

设置位置:主题设置 → 内容页面 → 文章博客

修改文件数量: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;
}

 

四、功能特点

  • 多语言分类:每个语言版本可以选择不同的分类组合
  • 自动匹配:根据当前语言自动显示对应的分类筛选
  • 向后兼容:保留单语言版本,不影响现有配置
  • 分类多选:每个语言版本可以同时选择多个分类

五、使用方法

  1. 进入 WordPress 后台 → 主题设置 → 内容页面 → 文章博客
  2. 找到 博客页分类筛选(多语言)
  3. 点击 添加语言 按钮
  4. 填写语言缩写(如:zh、en)
  5. 选择该语言要显示的分类(支持多选)
  6. 重复步骤3-5,添加更多语言版本
  7. 保存设置

注意:

  • 需要在”基础设置”中开启”多语言”选项
  • 默认语言建议放在第一位
  • 每个语言版本可以独立选择要显示的分类
  • 建议配合 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行修改
© 版权声明

相关文章

暂无评论

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