纯代码实现WordPress 去除 category 和链接重定向

在 WordPress 网站中,默认的分类链接中会包含 “category” 前缀(如 https://www.xcbtmw.com/category/news)。为了获得更简洁的 URL 和更好的 SEO 效果,许多站长希望去除这个前缀,使链接更具可读性且简洁。本文老白将介绍两段代码,一种保留旧链接兼容性,通过添加重写规则,确保旧链接能成功跳转到新链接,不会出现404 not found nginx报错,适合老站;另一种没有保留跳转功能,代码更少,适用于新站。两段代码都是直接添加到主题的function.php即可使用,告别插件。

纯代码实现WordPress 去除 category 和链接重定向

key point
两段代码都是老白亲测并且在用的,不是网上那种一大堆拿过来用都用不了的

1. 旧链接跳转代码-老站

这种方法适合已发布大量内容的网站,能确保旧链接不会因为改动而无法访问。通过代码,我们实现了从旧链接到新链接的 301 重定向,以便搜索引擎和用户在访问旧链接时自动跳转至优化后的 URL。

将以下代码添加到主题的 functions.php 文件中:

// 移除分类链接中的 category 字符,保留旧链接兼容性https://www.xcbtmw.com/30331.html
function remove_category_base() {
    add_action('created_category', 'flush_rewrite_rules');
    add_action('delete_category', 'flush_rewrite_rules');
    add_action('edited_category', 'flush_rewrite_rules');
    add_action('init', 'remove_category_url_permastruct');
    add_filter('category_rewrite_rules', 'remove_category_url_rewrite_rules');
    add_filter('query_vars', 'remove_category_url_query_vars');
    add_filter('request', 'remove_category_url_request');
}

function remove_category_url_permastruct() {
    global $wp_rewrite;
    $wp_rewrite->extra_permastructs['category']['struct'] = '%category%';
}

function remove_category_url_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 (0 != $category->parent) {
            $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]';
    }

    // 旧的 category 重写规则,用于重定向到新链接
    $old_category_base = get_option('category_base') ? get_option('category_base') : 'category';
    $category_rewrite[$old_category_base . '/(.*)$'] = 'index.php?category_redirect=$matches[1]';

    return $category_rewrite;
}

function remove_category_url_query_vars($public_query_vars) {
    $public_query_vars[] = 'category_redirect';
    return $public_query_vars;
}

function remove_category_url_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;
}

remove_category_base();

解释:

  • remove_category_base() 函数注册了一系列的钩子和过滤器,确保 WordPress 将分类结构中的 “category” 基础替换为空字符串。
  • remove_category_url_request() 函数负责检测旧链接并执行 301 重定向,让用户自动跳转到新 URL​。

2.不保留跳转代码-新站

对于全新的网站或对旧链接兼容性要求不高的网站,可以选择不包括 301 重定向的代码实现。这种方法简单直接,无需额外的兼容性代码:

// 简化分类链接中的 category 字符,不保留旧链接兼容性https://www.xcbtmw.com/30331.html
function remove_category_base_simple() {
    add_action('init', 'flush_rewrite_rules');
    add_action('init', 'remove_category_url_permastruct');
    add_filter('category_rewrite_rules', 'remove_category_url_rewrite_rules');
}

function remove_category_url_permastruct() {
    global $wp_rewrite;
    $wp_rewrite->extra_permastructs['category']['struct'] = '%category%';
}

function remove_category_url_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 (0 != $category->parent) {
            $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]';
    }

    return $category_rewrite;
}

remove_category_base_simple();

3.说明

无论选择保留旧链接兼容性还是直接优化新链接,都要在完成代码修改后,前往 设置 > 固定链接

并点击“保存更改”以刷新 WordPress 的伪静态重写规则。

此外,为防止流量丢失和 SEO 问题,建议检查并确保所有链接工作正常。

更多建站经验和WordPress技巧请点击文末标签阅读!