WordPress自定义分类法归档页出现404错误求助
问题原因及解决方案
核心问题
你的代码存在两个关键问题导致分类法归档页404:
- 重写规则冲突:自定义文章类型(CPT)的
rewriteslug与分类法的归档slug使用了相同前缀onze-producten-en-diensten,WordPress无法正确区分/onze-producten-en-diensten是分类法归档还是CPT的层级路径,导致请求匹配失败。 - CPT注册顺序错误:先注册CPT再注册分类法,虽然后续用
register_taxonomy_for_object_type补关联,但可能导致重写规则生成异常。
具体修复步骤
1. 清理代码并调整注册顺序
先注册分类法,再注册CPT,同时移除CPT中重复的rewrite键(原代码重复定义两次rewrite,后一次覆盖前一次,属于冗余代码):
/** * Service taxonomy - 先注册分类法 */ add_action('init', function() { register_taxonomy('service_category', ['service'], [ 'label' => __('Dienst categorieen', 'txtdomain'), 'hierarchical' => true, 'has_archive' => true, 'rewrite' => array('slug' => 'onze-producten-en-diensten'), 'show_admin_column' => true, 'show_in_rest' => true, 'labels' => [ 'singular_name' => __('Dienst categorie', 'txtdomain'), // 修正单数标签(非404原因,但符合规范) 'all_items' => __('Alle dienst categorieen', 'txtdomain'), 'edit_item' => __('Dienst categorie bewerken', 'txtdomain'), 'view_item' => __('Dienst categorie bekijken', 'txtdomain'), 'update_item' => __('Dienst categorie bijwerken', 'txtdomain'), 'add_new_item' => __('Nieuwe dienst categorie toevoegen', 'txtdomain'), 'new_item_name' => __('Nieuwe dienst categorie', 'txtdomain'), 'search_items' => __('Dienst categorie zoeken', 'txtdomain'), 'popular_items' => __('Populaire dienst categorieen', 'txtdomain'), 'not_found' => __('Geen dienst categorie gevonden', 'txtdomain'), ] ]); }); /** * Service custom post type - 后注册CPT */ add_action('init', function() { register_post_type('service', [ 'label' => __('Diensten', 'txtdomain'), 'public' => true, 'menu_position' => 5, 'menu_icon' => 'dashicons-book', 'supports' => ['title', 'editor', 'thumbnail', 'author', 'revisions', 'comments'], 'show_in_rest' => true, 'taxonomies' => ['service_category'], 'rewrite' => array('slug' => 'onze-producten-en-diensten/%service_category%', 'with_front' => false), 'labels' => [ 'singular_name' => __('Dienst', 'txtdomain'), 'add_new_item' => __('Nieuwe dienst toevoegen', 'txtdomain'), 'new_item' => __('Nieuwe dienst', 'txtdomain'), 'view_item' => __('Dienst bekijken', 'txtdomain'), 'not_found' => __('Geen dienst gevonden', 'txtdomain'), 'not_found_in_trash' => __('Geen dienst gevonden in de prullenbak', 'txtdomain'), 'all_items' => __('Alle diensten', 'txtdomain'), 'insert_into_item' => __('Dienst toevoegen', 'txtdomain') ], ]); }); // 可移除该行,CPT注册时已通过taxonomies参数关联分类法 // register_taxonomy_for_object_type('service_category', 'service');
2. 添加占位符替换过滤器
CPT的permalink中使用了%service_category%占位符,必须添加过滤器替换为实际分类slug(你说单页正常,可能已添加,但确保代码包含):
add_filter('post_type_link', 'service_permalink_replace', 10, 3); function service_permalink_replace($permalink, $post, $leavename) { if ($post->post_type !== 'service') return $permalink; // 获取文章关联的首个service_category分类 $terms = wp_get_object_terms($post->ID, 'service_category'); if (!empty($terms) && !is_wp_error($terms)) { $permalink = str_replace('%service_category%', $terms[0]->slug, $permalink); } else { // 处理无分类的情况,可自定义默认slug $permalink = str_replace('%service_category%', 'zonder-categorie', $permalink); } return $permalink; }
3. 调整重写规则优先级
通过过滤器让分类法归档的规则优先匹配,避免被CPT规则拦截:
add_filter('rewrite_rules_array', 'prioritize_service_taxonomy_archive'); function prioritize_service_taxonomy_archive($rules) { $new_rules = []; // 优先匹配分类法归档URL $new_rules['onze-producten-en-diensten/?$'] = 'index.php?service_category='; // 合并原有规则到新规则之后 foreach ($rules as $rule => $query) { $new_rules[$rule] = $query; } return $new_rules; }
4. 刷新固定链接
完成上述修改后,进入WordPress后台 → 设置 → 固定链接,直接点击“保存更改”(无需修改设置),触发重写规则更新。
验证
- 访问
/onze-producten-en-diensten:应正常加载archive-service_category.php - 访问
/onze-producten-en-diensten/{taxonomy_name}:正常加载taxonomy-service_category.php - 访问
/onze-producten-en-diensten/{taxonomy_name}/{single_post_name}:正常加载single-service.php
内容的提问来源于stack exchange,提问作者Jari Rengeling
相关产品推荐
相关产品推荐

