WordPress移除分类目录固定链接前缀

WordPress分类页面的固定链接默认是携带category前缀的,另外子分类固定链接还会附加父分类的slug名称,并不是很美观。现提供一种简易的,不需要插件,不通过rewrite规则来实现去除分类固定链接前缀,包括父级slug前缀。

将下述代码添加至主题functions.php文件中

 

add_filter('request', function ($query_vars) {
    global $wp;
    global $wp_query;
    $pagename = '';
    if (!empty($query_vars['error']) && $query_vars['error'] == '404' && !empty($wp->request)) {
        // %postname%模式
        $pagename = $wp->request;
    } elseif (!empty($query_vars['pagename'])) {
        // %post_id%模式
        $pagename = $query_vars['pagename'];
    }
    if (!empty($pagename)) {
        $pagename    =  $pagename;
        $categories    = get_categories(['hide_empty' => false]);
        $categories    = wp_list_pluck($categories, 'slug');

        if (in_array($pagename, $categories)) {
            $query_vars['category_name']    = $pagename;
            unset($query_vars['error']);
            unset($query_vars['pagename']);
            $wp_query->is_home = false;
            $wp_query->is_404 = false;
            $wp_query->is_category = true;
        }
    }

    return $query_vars;
}, 1, 1);

add_filter('pre_term_link', function ($term_link, $term) {
    if ($term->taxonomy == 'category') {
        return $term->slug;
    }

    return $term_link;
}, 10, 2);

其中,第一个filter是针对去除前缀后的链接可访问性处理,第二个filter是修改获取分类链接的方法,得到的链接都是去除前缀的。

Tint主题3.1.3以上版本已附带该功能,且提供主题选项供开启。