轻松去掉WordPress分类链接中的“category”目录的两种实用技巧!

通过代码去除WordPress URL中的分类参数

不建议使用插件,推荐通过代码方式来实现。只需将以下代码粘贴到主题目录中的 functions.php 文件的底部,即可去除URL中带有分类的参数。

/*
 插件名称: WP No Category Base
 插件网址: http://blinger.org/wordpress-plugins/no-category-base/
 描述: 移除分类固定链接中的 '/category' 部分。
 版本: 1.1.1
 作者: iDope
 作者网址: http://efextra.com/
 */

// 在激活/停用时以及分类更改时刷新规则
register_activation_hook(__FILE__, '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');
	// 不希望再次插入自定义规则
	no_category_base_refresh_rules();
}

// 移除分类基础
add_action('init', 'no_category_base_permastruct');
function no_category_base_permastruct() {
	global $wp_rewrite, $wp_version;
	if (version_compare($wp_version, '3.4', 'extra_permastructs['category'][0] = '%category%';
	} else {
		$wp_rewrite->extra_permastructs['category']['struct'] = '%category%';
	}
}

// 添加自定义的分类重写规则
add_filter('category_rewrite_rules', 'no_category_base_rewrite_rules');
function no_category_base_rewrite_rules($category_rewrite) {
	//var_dump($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 ($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]';
	}
	
	// 处理旧的分类基础重定向
	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); // 调试用
	return $category_rewrite;
}

// 调试用
//add_filter('rewrite_rules_array', 'no_category_base_rewrite_rules_array');
//function no_category_base_rewrite_rules_array($category_rewrite) {
//	var_dump($category_rewrite); // 调试用
//}

// 添加 'category_redirect' 查询变量
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;
}

// 如果设置了 'category_redirect',则进行重定向
add_filter('request', 'no_category_base_request');
function no_category_base_request($query_vars) {
	//print_r($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;
}
来源:知乎
原文标题:WordPress 去掉分类链接中 category 目录的两种方法是什么? – 阿峰博客 的回答
声明:
文章来自网络收集后经过ai改写发布,如不小心侵犯了您的权益,请联系本站删除,给您带来困扰,深表歉意!

本文标题:轻松去掉WordPress分类链接中的“category”目录的两种实用技巧!
网址:https://www.2090ai.com/2025/11/08/plugins/65999.html



本站所有文章由wordpress极光ai post插件通过chatgpt写作修改后发布,并不代表本站的观点;如果无意间侵犯了你的权益,请联系我们进行删除处理。
如需转载,请务必注明文章来源和链接,谢谢您的支持与鼓励!