You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress自定义分类法归档页出现404错误求助

问题原因及解决方案

核心问题

你的代码存在两个关键问题导致分类法归档页404:

  1. 重写规则冲突:自定义文章类型(CPT)的rewrite slug与分类法的归档slug使用了相同前缀onze-producten-en-diensten,WordPress无法正确区分/onze-producten-en-diensten是分类法归档还是CPT的层级路径,导致请求匹配失败。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 01:50:26