这里有一个客户的网站初期默认设置的是ID URL,这里他在新建立的某个目录分类中希望不用ID URL,而是采用自定义SLUG URL。按照常理,我们需要统一一致的URL,这里我们可以单独指定某个分类设置支持自定义URL。
// 修改tools分类下文章的链接生成
function tools_post_permalink($post_link, $post) {
if ($post->post_type === 'post') {
$categories = get_the_category($post->ID);
if (!empty($categories)) {
foreach ($categories as $category) {
if ($category->slug === 'tools') {
// 使用 文章slug.html 的格式
return home_url('/' . $post->post_name . '.html');
}
}
}
}
return $post_link;
}
add_filter('post_link', 'tools_post_permalink', 10, 2);
// 添加自定义查询变量
function tools_query_vars($vars) {
$vars[] = 'tools_post_slug';
return $vars;
}
add_filter('query_vars', 'tools_query_vars');
// 处理tools分类下文章的查询解析
function tools_parse_request($wp) {
if (isset($wp->query_vars['tools_post_slug'])) {
$post_slug = $wp->query_vars['tools_post_slug'];
// 查找文章
$post = get_page_by_path($post_slug, OBJECT, 'post');
if ($post) {
// 验证文章是否属于tools分类
$categories = get_the_category($post->ID);
$is_tools_category = false;
foreach ($categories as $category) {
if ($category->slug === 'tools') {
$is_tools_category = true;
break;
}
}
if ($is_tools_category) {
// 设置查询变量为单篇文章
$wp->query_vars['p'] = $post->ID;
$wp->query_vars['post_type'] = 'post';
unset($wp->query_vars['tools_post_slug']);
}
}
}
}
add_action('parse_request', 'tools_parse_request');
// 刷新重写规则(激活时使用)
function flush_tools_rewrite_rules() {
tools_custom_permalink_structure();
flush_rewrite_rules();
}
// 取消注释下面的行来刷新重写规则(仅在需要时使用)
// add_action('after_switch_theme', 'flush_tools_rewrite_rules');
// 确保面包屑导航正确显示tools分类链接(保持原有分类链接)
function tools_breadcrumb_link($link, $category) {
if ($category->slug === 'tools') {
return home_url('/category/tools/');
}
return $link;
}
add_filter('get_category_link', 'tools_breadcrumb_link', 10, 2);
如上代码设置之后,我们可以重置保存一下固定链接后,我们在指定的 tools 分类中的内容页可以自定义URL页面名称,然后可以看到其他的分类下的文章是采用的ID URL,而Tools分类采用的Slug URL。
https://www.example.com/bmi-calculator.html
类似这样的格式。当然,我们也可以根据实际的需要去修改。