WordPress去掉URL链接中自带的category分类目录前缀

原创 互联网  2020-11-12 18:58  阅读 4,148 次
摘要:

默认情况下分类页面的URL地址中有一个 /category/ 目录,这个目录不仅会影响用户体验还会影响网站整体的SEO效果(网站的目录层次越少越利于搜索引擎抓取,也越利于获取更好的排名)。

在使用WordPress博客程序搭建网站的时候,WordPress的分类存档是非常重要的页面,在网站树形结构中占据一席位置。但是默认情况下分类页面的URL地址中有一个 <strong class="red">/category/</strong> 目录,这个目录不仅会影响用户体验还会影响网站整体的SEO效果(网站的目录层次越少越利于搜索引擎抓取,也越利于获取更好的排名)。所以为了网站的SEO效果,必须要去掉这个category二级目录,降低目录的深度。那么如何去除wordpress自带的一层category目录呢?

温馨提示

如果你的是新站,可以考虑去掉这个category分类标志;如果你的是老站(也就是说搜索引擎已经收录了分类目录),建议不用折腾了,如果真要折腾去掉,一定要注意做一下分类链接的301跳转。

WordPress去除分类目录URL路径中category分类目录前缀的四种办法:

方法一:在后台“固定链接”中设置“分类目录前缀”

登录你的Wordpress后台,打开 “设置 —》固定链接 —》” 页面。在 “可选” 设置项里的 “分类目录前缀” 里输入半角字符: “.” ,如下图所示,保存后即可去掉分类前缀category。

去掉WordPress分类目录前缀

优点:设置简单,老少皆宜。适用于初建成的博客,或刚打算使用固定链接 /永久链接的博客。用不着修改代码,升级之时没有顾虑;用不着插件,不会增加运行负担。

缺点:原链接无法打开,出现404错误。被搜索引擎收录良好,或分类链接有较多外链链入的博客,可要万分小心了。不要因为操作简单、省时省力而损失了大量外链及权重。因为它并没有插件所支持的自动 301 跳转,且原地址仍可以访问。(例如:www.aszhi.com/seo/与www.aszhi.com/category/seo/都是可以访问并且内容完全一样)这会造成谷歌网站管理员工具里提到的,重复的标题。而且这种钻官方代码空子的方法难保会一直有效下去。

温馨提示

在“分类目录前缀”那一栏里写入英文半角的点,此时得需要你的网站是全新的,没有分类栏目和文章,这样才不会出错,如果已有文章,这样的方法会使你的文章和分类栏目不存在,容易出现错误。

方法二:借助Wordpress插件实现

(1)使用 WP No Category Base 插件,在后台插件管理中搜索“WP No Category Base”(如下图所示),然后下载安装。此插件主要是为去除固定链接中分类链接里的category而开发出来的一款wordpress插件。

安装启用此插件后,对原来的分类地址做了301重定向跳转,对SEO优化有好处,把降权风险降到最低。

(2)使用 No category parents 插件,在后台插件管理中搜索“No category parents”,然后下载安装。此插件不仅能去掉分类链接的前缀category,还能去掉父分类parent-category。例如:将“/category/parent-category/my-category/”换成“/my-category/” 。

利用Wordpress插件去除category分类目录前缀

优点:安装简单,老少皆宜。无论是初建成的博客,还是正打算使用固定链接/永久链接的博客,还是被搜索引擎收录良好的博客。用不着修改代码,升级之时没有顾虑。使用301跳转,把原链接进行跳转。最大程度符合seo优化,防止搜索引擎降权,防止原链接打不开。

不足:插件或许会造成空间负担。这里不说是缺点,就是因为,造成的“空间负担”微乎其微,不应该是缺点。比较在意的就不用,无所谓推荐使用。

方法三:纯代码实现

纯代码去掉WordPress分类目录链接中的category分类标志,也非常简单,只需要将以下代码放在 当前主题的模板函数文件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();
}

// register_deactivation_hook(__FILE__, 'no_category_base_deactivate');
// function no_category_base_deactivate() {
//     remove_filter('category_rewrite_rules', 'no_category_base_rewrite_rules');
//     // We dont 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;
}

优点:仅加入一段代码,性能影响忽略不计。适用于对代码稍熟悉的博客。

缺点:修改代码,博客主题升级还要修改。

注意事项

不管安装插件或者用代码可能会出现404页面,这是因为“固定链接”这里设置的“%post_id%.html( /%category%/%post_id%.html )”的伪静态失效了!

解决方法:登录后台→设置→固定链接设置页面,随意改一下固定链接格式,然后再改回自己正常用的符合网站伪静态规则的固定链接格式,可以解决这个bug,不行就反复多改几次。

PS:如果还会出现404,建议把所有缓存清除后再尝试!

本文地址:http://aszhi.com/web/wordpress/28.html
关注我们:请关注一下微信号:扫描二维码爱思智前端的微信号
版权声明:本文为原创文章,版权归 互联网 所有,欢迎分享本文,转载请保留出处!

发表评论


表情