这是个老生常谈的问题了,网上有一大堆的解决方法,这里进行一个总结,可分为三种方法:
一、使用插件
网上有很多相关的 WordPress 插件,都可以解决这个问题,不过大部分插件都是把所有的分类都写入 WordPress 的 rewrite 规则,这样会造成 rewrite 规则会非常臃肿,反而会使得 WordPress 变慢。所以,这个方法不是很推荐。
二、设置分类目录前缀
另外 WordPress 还有一个非常方便的方法,可以说是最简化去掉分类目录 URL 中的 category。只需要在 WordPress 后台,点击「设置」菜单下的「固定链接」子菜单,将「分类目录前缀」设置为 . 就可以:
三、写 PHP 语句
如果仔细观察一下去掉 category 的分类目录 url:
https://www.hack520.com/wordpress/,
是不是和 WordPress 的页面规则是一样的,比如开心技术乐园微技术页面:
https://www.hack520.com/microtech/,
那么我们可以使用页面的 rewrite 规则来处理。
当 WordPress 进入页面 rewrite 规则的时候,我们判断一下,当前的 pagename 是不是某个分类的 slug,如果是,就把当前的 query_var 中的 pagename 换成 category_name,这样就可以实现了。
add_filter('request', function($query_vars) { if(!isset($_GET['page_id']) && !isset($_GET['pagename']) && !empty($query_vars['pagename'])){ $pagename = $query_vars['pagename']; $categories = get_categories(['hide_empty'=>false]); $categories = wmh_list_pluck($categories, 'slug'); if(in_array($pagename, $categories)){ $query_vars['category_name'] = $query_vars['pagename']; unset($query_vars['pagename']); } } return $query_vars; }); add_filter('pre_term_link', function($term_link, $term){ if($term->taxonomy == 'category'){ return '%category%'; } return $term_link; }, 10, 2);