博客 / WordPress/ WordPress如何去掉分类链接中的category

WordPress如何去掉分类链接中的category

为什么要去掉分类链接中的 category

在对 WordPress 博客进行优化时,许多细节不容忽视,例如分类链接中的 category 路径。默认情况下,WordPress 分类的链接地址会包含 /category/ 目录,例如:https://youquso.com/category/theme

这种 URL 结构仍有优化空间。URL 优化是 SEO 中相对重要的环节,如果能去掉分类链接中的 category,可以使链接更简洁、更友好,对网站 SEO 优化有利。

如何去掉分类链接中的 category

下面分享一段用于去掉分类链接中 category 的 WordPress 代码。您无需完全理解其原理,只需将代码正确添加到主题的 functions.php 文件中即可生效。

// 去掉分类链接中的 category
add_action( 'load-themes.php', 'no_category_base_refresh_rules');
add_action('created_category', 'no_category_base_refresh_rules');
add_action('edited_category', 'no_category_base_refresh_rules');
add_action('delete_category', 'no_category_base_refresh_rules');
function no_category_base_refresh_rules() {
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}

// 移除分类基础前缀
add_action('init', 'no_category_base_permastruct');
function no_category_base_permastruct() {
    global $wp_rewrite, $wp_version;
    if (version_compare($wp_version, '3.4', '<')) {
        // 针对 3.4 之前版本的兼容处理
        $wp_rewrite->extra_permastructs['category'][0] = '{5cc1b29162d549a8071384de182cc9fc6e6a0fd85e7907f22fd9e18cff4269c3}category{5cc1b29162d549a8071384de182cc9fc6e6a0fd85e7907f22fd9e18cff4269c3}';
    } else {
        $wp_rewrite->extra_permastructs['category']['struct'] = '{5cc1b29162d549a8071384de182cc9fc6e6a0fd85e7907f22fd9e18cff4269c3}category{5cc1b29162d549a8071384de182cc9fc6e6a0fd85e7907f22fd9e18cff4269c3}';
    }
}

// 添加自定义的分类重写规则
add_filter('category_rewrite_rules', 'no_category_base_rewrite_rules');
function no_category_base_rewrite_rules($category_rewrite) {
    $category_rewrite = array();
    $categories = get_categories(array('hide_empty' => false));
    foreach ($categories as $category) {
        $category_nicename = $category->slug;
        if ($category->parent == $category->cat_ID) {
            // 防止递归
            $category->parent = 0;
        } elseif ($category->parent != 0) {
            $category_nicename = get_category_parents($category->parent, false, '/', true) . $category_nicename;
        }
        $category_rewrite['(' . $category_nicename . ')/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$'] = 'index.php?category_name=$matches[1]&feed=$matches[2]';
        $category_rewrite['(' . $category_nicename . ')/page/?([0-9]{1,})/?$'] = 'index.php?category_name=$matches[1]&paged=$matches[2]';
        $category_rewrite['(' . $category_nicename . ')/?$'] = 'index.php?category_name=$matches[1]';
    }
    // 支持从旧分类基础路径重定向
    global $wp_rewrite;
    $old_category_base = get_option('category_base') ? get_option('category_base') : 'category';
    $old_category_base = trim($old_category_base, '/');
    $category_rewrite[$old_category_base . '/(.*)$'] = 'index.php?category_redirect=$matches[1]';
    return $category_rewrite;
}

// 添加 'category_redirect' 查询变量
add_filter('query_vars', 'no_category_base_query_vars');
function no_category_base_query_vars($public_query_vars) {
    $public_query_vars[] = 'category_redirect';
    return $public_query_vars;
}

// 如果设置了 'category_redirect' 则进行重定向
add_filter('request', 'no_category_base_request');
function no_category_base_request($query_vars) {
    if (isset($query_vars['category_redirect'])) {
        $catlink = trailingslashit(get_option('home')) . user_trailingslashit($query_vars['category_redirect'], 'category');
        status_header(301);
        header("Location: $catlink");
        exit();
    }
    return $query_vars;
}

使用说明与注意事项

1. 代码放置:请将上述完整代码添加到您当前使用主题的 functions.php 文件末尾。

2. 刷新规则:添加代码后,需要访问一次 WordPress 后台的「设置」→「固定链接」页面,点击「保存更改」以刷新重写规则,使修改生效。

3. 效果:应用后,分类链接将从 https://example.com/category/theme 变为 https://example.com/theme

4. 兼容性:此代码适用于大多数 WordPress 版本。但请注意,在进行任何核心文件修改前,建议先备份您的网站和数据库。

5. 插件替代方案:如果您觉得手动添加代码较为复杂,也可以考虑使用专门的插件(如 "Remove Category URL" 或 "WP No Category Base")来实现相同功能,操作更简便。

发表评论

您的邮箱不会公开。必填项已用 * 标注。