​​移除WordPress分类URL中的默认”category”前缀,让链接更美观

文章目录

在我们使用WordPress的时候,默认的前端分类URL链接中会有“category”在链接中,这对我们而言显示效果并不好。因此,对于一个合格的站长而言是有必要做一些调整,移除这个前缀,让它显示更直观美好的。

那么,我们需要怎么做才可以移除分类链接中默认的“category”前缀呢!其实操作起来也很简单。

操作方法:

移除WordPress分类URL中默认的"category"前缀,通过以下代码就可实现,将以下代码放置在主题文件的“functions.php”文件中保存,再到后台“设置——固定链接”刷新保存就可以生效了。

 

// 分类去除默认
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();
}
// register_deactivation_hook(__FILE__, 'no_category_base_deactivate');
// function no_category_base_deactivate() {
// remove_filter('category_rewrite_rules', 'no_category_base_rewrite_rules');
// // We don't want to insert our custom rules again
// no_category_base_refresh_rules();
// }
// Remove category base
add_action('init', 'no_category_base_permastruct');
function no_category_base_permastruct() {
global $wp_rewrite, $wp_version;
if (version_compare($wp_version, '3.4', '<')) { // For pre-3.4 support $wp_rewrite -> extra_permastructs['category'][0] = '%category%';
} else {
$wp_rewrite -> extra_permastructs['category']['struct'] = '%category%';
}
}
// Add our custom category rewrite rules
add_filter('category_rewrite_rules', 'no_category_base_rewrite_rules');
function no_category_base_rewrite_rules($category_rewrite) {
//var_dump($category_rewrite); // For Debugging
$category_rewrite = array();
$categories = get_categories(array('hide_empty' => false));
foreach ($categories as $category) {
$category_nicename = $category -> slug;
if ($category -> parent == $category -> cat_ID)// recursive recursion
$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]';
}
// Redirect support from Old Category Base
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]';

//var_dump($category_rewrite); // For Debugging
return $category_rewrite;
}

// Add 'category_redirect' query variable
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;
}

// Redirect if 'category_redirect' is set
add_filter('request', 'no_category_base_request');
function no_category_base_request($query_vars) {
//print_r($query_vars); // For Debugging
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;
}

代码解释:

这段代码的主要作用是 移除WordPress分类URL中的默认"category"前缀,并确保修改后的URL能够正常工作(包括分页、Feed等),同时处理旧URL的重定向问题。以下是代码的详细功能解析:

1. 刷新重写规则(Flush Rules)

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();
}
  • 作用:在以下场景强制刷新WordPress的重写规则(URL结构):
    • 切换主题时(load-themes.php
    • 分类被创建、编辑或删除时
  • 目的:确保自定义的分类URL规则及时生效。

2. 移除分类URL中的"category"前缀

add_action('init', 'no_category_base_permastruct');
function no_category_base_permastruct() {
    global $wp_rewrite, $wp_version;
    if (version_compare($wp_version, '3.4', '<')) {
        $wp_rewrite->extra_permastructs['category'][0] = '%category%';
    } else {
        $wp_rewrite->extra_permastructs['category']['struct'] = '%category%';
    }
}
  • 作用:修改WordPress的分类URL结构,将默认的 /category/分类名称/ 改为 /分类名称/
  • 兼容性:支持WordPress 3.4及以上和以下版本。

3. 生成自定义分类重写规则

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;
        // 处理父级分类(生成嵌套分类的URL)
        if ($category->parent != 0) {
            $category_nicename = get_category_parents($category->parent, false, '/', true) . $category_nicename;
        }
        
        // 添加分类的Feed规则
        $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]';
    }
    
    // 旧URL(含/category/)的重定向规则
    $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;
}
  • 作用
    • 为所有分类(包括嵌套分类)生成新的URL规则,确保以下功能正常:
      • 基础分类页(如 /news/
      • 分类分页(如 /news/page/2/
      • 分类Feed(如 /news/feed/
    • 捕获旧URL(如 /category/news/)并重定向到新URL(如 /news/)。

4. 处理旧URL的重定向

// 添加查询变量
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;
}

// 执行301重定向
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;
}
  • 作用
    • 当用户访问旧URL(如 /category/news/)时,触发301重定向到新URL(如 /news/)。
    • 避免SEO损失(301是永久重定向,搜索引擎会传递权重)。

代码的完整工作流程

  1. 移除前缀:通过修改 $wp_rewrite 移除URL中的 /category/
  2. 生成规则:为所有分类动态生成新的URL规则(包括分页、Feed)。
  3. 捕获旧URL:将含 /category/ 的旧URL匹配为 category_redirect 查询变量。
  4. 重定向旧URL:通过301跳转到新URL,确保用户和搜索引擎无缝过渡。

注意事项

  1. 插件冲突:如果已安装其他修改分类URL的插件,需禁用它们。
  2. 缓存问题:修改后需清除WordPress缓存(或服务器缓存)。
  3. 测试验证:检查分类页、分页、Feed是否正常,旧URL是否正确跳转。

如果需要更简单的解决方案,建议直接使用 WP No Category Base 插件。此代码适合需要深度自定义或学习WordPress重写规则的用户。

声明:本文由 时光 创作,如无特别说明,均为作者原创,版权归作者所有。任何企业和个人禁止未经授权使用,否则追究相关责任。

发表回复

要发表评论,您必须先登录