WordPress CPT归档页与分类法slug重写规则配置咨询
WordPress 自定义文章类型省略分类法标识的URL重写方案
现有代码问题说明
你当前的重写规则存在两个核心问题:
- 规则明确匹配了
location/industry作为URL的组成部分,自然无法实现省略分类法标识的效果 - 规则中存在拼写错误,将
industry写为indudtry,也会导致规则匹配失败
具体实现步骤
1. 新增重写规则匹配无分类法标识的URL
function custom_staff_rewrite_rules() { // 匹配两个分类项嵌套的格式:staff/[term1]/[term2]/ add_rewrite_rule( '^staff/([^/]+)/([^/]+)/?$', 'index.php?post_type=staff&staff_term1=$matches[1]&staff_term2=$matches[2]', 'top' ); // 匹配单个分类项的格式:staff/[term]/ add_rewrite_rule( '^staff/([^/]+)/?$', 'index.php?post_type=staff&staff_term1=$matches[1]', 'top' ); } add_action('init', 'custom_staff_rewrite_rules');
2. 注册自定义查询变量
让WordPress可以识别我们自定义的URL参数:
function add_staff_query_vars($vars) { $vars[] = 'staff_term1'; $vars[] = 'staff_term2'; return $vars; } add_filter('query_vars', 'add_staff_query_vars');
3. 解析查询参数映射到对应分类法
通过pre_get_posts钩子判断传入的分类别名属于哪个分类法,动态修改主查询参数:
function parse_staff_terms($query) { // 仅对前台staff归档的主查询生效 if (!is_admin() && $query->is_main_query() && is_post_type_archive('staff')) { $term1 = get_query_var('staff_term1'); $term2 = get_query_var('staff_term2'); $tax_query = ['relation' => 'AND']; if ($term1) { $term_obj = get_term_by('slug', $term1, ['location', 'industry']); if ($term_obj) { $tax_query[] = [ 'taxonomy' => $term_obj->taxonomy, 'field' => 'slug', 'terms' => $term_obj->slug ]; } } if ($term2) { $term_obj = get_term_by('slug', $term2, ['location', 'industry']); if ($term_obj) { $tax_query[] = [ 'taxonomy' => $term_obj->taxonomy, 'field' => 'slug', 'terms' => $term_obj->slug ]; } } if (!empty($tax_query)) { $query->set('tax_query', $tax_query); } } } add_action('pre_get_posts', 'parse_staff_terms');
4. 修改筛选表单提交逻辑
调整你页面上的两个筛选下拉框的提交逻辑,不要用默认的GET参数提交方式,改为用户选中分类项后,直接把选中的分类别名拼接成/staff/[term1]/[term2]/格式的URL跳转即可。
注意事项
- 所有代码修改完成后,必须进入WordPress后台【设置】-【固定链接】页面点击「保存更改」,刷新重写规则后新规则才会生效
- 请确保
location和industry两个分类法下没有重复的分类别名(slug),否则会出现分类法识别错误的问题 - 如果需要自动输出对应格式的分类链接,可以额外挂载
term_link钩子修改分类项的默认链接输出,无需手动拼接
内容的提问来源于stack exchange,提问作者sam_devloper3456
相关产品推荐
相关产品推荐

