除掉 WordPress 分类目录链接中 category 字符的方法

很多人在初次使用 wordpress 创建分类目录编写文章发表后发现文章地址链接不是自己想象的样式,不是域名-分类别名-文章名组成,

如:www.你的域名.com/wordpress/123.html

而是:www.你的域名.com/categorg/wordpress/123.html

多了一个 categorg 这样的链接形式既不美观又增加了固定链接的层数深度不利于搜索收录,那么怎么去掉固定链接中 categorg 字符呢?

网上搜索一下发现有很多相关文章,但大部分都不好用,什么后台固定链接设置中分类目录前缀添加“.”(谁想出来这么不靠谱不实用的方法,大家网上还互相转来转去的),还有修改 wordpress 源文件的方法(且不说每次版本升级都会被覆盖的问题,针对 wordpress 不同版本也不是都适用的)。

 

这里我说两种比较实用的方法,插件和非插件代码实现去掉 wordpress categorg 链接字符

 

使用 WordPress 插件去掉分类目录链接前缀 category

推荐 No Category Base (WPML) 插件:是为去除固定链接中分类链接里的 category 而开发出来的一款 wordpress 插件,已经被下载了十万多次。安装启用此插件后,对原来的分类地址做了301跳转,对搜索收录优化有好处,把网站降权风险降到了最低。(当然还有很多类似插件,这里就不一一介绍了,有兴趣可自行去搜索一下)

优点:安装简单老少皆宜。无论是初建成的博客,还是正打算使用固定链接的老博客,用不着修改代码,程序升级之时也没有顾虑。其使用301跳转,最大程度防止搜索引擎降权,防止原链接打不开。

缺点:用了 No Category Base (WPML) 插件的话最好就一直使用下去,如果卸载不彻底会造成原文章无法访问的问题。

如果你已经安装该插件,现在又想卸载可以试试下面这个方法:

1、先在设置-固定链接内将URL方案换成开头默认的;

2、再在插件设置内禁用该插件;

3、最后改回原固定链接方案,并且删除插件;

好了,就这么简单咯,全部解决,然后,就没有然后了。

如果你不想为这么一个简单的东西而使用一款插件的话(WordPress 非插件强迫症),可以试试下面介绍的方法。

 

非插件代码化实现去掉 WordPress 分类链接中 category 字符

其实代码就是移植简化的 WP No Category Base 插件中部分源码,在你当前主题的 functions.php 文件中添加如下代码就好:

  1. //分类链接category字符移除
  2. add_action( 'load-themes.php', 'no_category_base_refresh_rules');
  3. add_action('created_category', 'no_category_base_refresh_rules');
  4. add_action('edited_category', 'no_category_base_refresh_rules');
  5. add_action('delete_category', 'no_category_base_refresh_rules');
  6. function no_category_base_refresh_rules() {
  7. global $wp_rewrite;
  8. $wp_rewrite -> flush_rules();
  9. }
  10. // register_deactivation_hook(__FILE__, 'no_category_base_deactivate');
  11. // function no_category_base_deactivate() {
  12. // remove_filter('category_rewrite_rules', 'no_category_base_rewrite_rules');
  13. // // We don't want to insert our custom rules again
  14. // no_category_base_refresh_rules();
  15. // }
  16. // Remove category base
  17. add_action('init', 'no_category_base_permastruct');
  18. function no_category_base_permastruct() {
  19. global $wp_rewrite, $wp_version;
  20. if (version_compare($wp_version, '3.4', '<')) {
  21. // For pre-3.4 support
  22. $wp_rewrite -> extra_permastructs['category'][0] = '%category%';
  23. } else {
  24. $wp_rewrite -> extra_permastructs['category']['struct'] = '%category%';
  25. }
  26. }
  27. // Add our custom category rewrite rules
  28. add_filter('category_rewrite_rules', 'no_category_base_rewrite_rules');
  29. function no_category_base_rewrite_rules($category_rewrite) {
  30. //var_dump($category_rewrite); // For Debugging
  31. $category_rewrite = array();
  32. $categories = get_categories(array('hide_empty' => false));
  33. foreach ($categories as $category) {
  34. $category_nicename = $category -> slug;
  35. if ($category -> parent == $category -> cat_ID)// recursive recursion
  36. $category -> parent = 0;
  37. elseif ($category -> parent != 0)
  38. $category_nicename = get_category_parents($category -> parent, false, '/', true) . $category_nicename;
  39. $category_rewrite['(' . $category_nicename . ')/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$'] = 'index.php?category_name=$matches[1]&feed=$matches[2]';
  40. $category_rewrite['(' . $category_nicename . ')/page/?([0-9]{1,})/?$'] = 'index.php?category_name=$matches[1]&paged=$matches[2]';
  41. $category_rewrite['(' . $category_nicename . ')/?$'] = 'index.php?category_name=$matches[1]';
  42. }
  43. // Redirect support from Old Category Base
  44. global $wp_rewrite;
  45. $old_category_base = get_option('category_base') ? get_option('category_base') : 'category';
  46. $old_category_base = trim($old_category_base, '/');
  47. $category_rewrite[$old_category_base . '/(.*)$'] = 'index.php?category_redirect=$matches[1]';
  48. //var_dump($category_rewrite); // For Debugging
  49. return $category_rewrite;
  50. }
  51. // Add 'category_redirect' query variable
  52. add_filter('query_vars', 'no_category_base_query_vars');
  53. function no_category_base_query_vars($public_query_vars) {
  54. $public_query_vars[] = 'category_redirect';
  55. return $public_query_vars;
  56. }
  57. // Redirect if 'category_redirect' is set
  58. add_filter('request', 'no_category_base_request');
  59. function no_category_base_request($query_vars) {
  60. //print_r($query_vars); // For Debugging
  61. if (isset($query_vars['category_redirect'])) {
  62. $catlink = trailingslashit(get_option('home')) . user_trailingslashit($query_vars['category_redirect'], 'category');
  63. status_header(301);
  64. header("Location: $catlink");
  65. exit();
  66. }
  67. return $query_vars;
  68. }

好了,现在去网站刷新一下看看有没有效果,是不是已经去掉 category 字符了!

 

你可能还需要查看关于 WordPress 固定链接优化设置的文章:

我的 WordPress 固定链接设置优化的方法记录

 

转载请注明链接地址:荐爱小站 » 除掉 WordPress 分类目录链接中 category 字符的方法

赞 (0) 赏 !

觉得文章有用就打赏一下吧,赠人玫瑰手有余香!

支付宝扫一扫打赏

微信扫一扫打赏