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

添加has_archive=true后WordPress自定义文章类型显示异常求助

自定义文章类型(Newsletters)has_archive配置问题及修复

问题背景

创建了名为newsletters的自定义文章类型(CPT),用于作为MailerLite的第二个RSS源。在2024主题的全编辑器模板区域,已添加archive: newsletter模板并修改查询为仅针对newsletters的自定义查询。

添加has_archive => true后出现的问题

  • 后台「所有新闻通讯」页面原本显示1篇已发布+1篇草稿的newsletters,现在显示所有常规博客文章,无newsletters内容
  • 归档页面domain/newsletters/默认使用通用归档模板而非archive: newsletter模板,显示博客文章而非newsletters(即使修改模板查询,newsletters也不在列表中)
  • RSS源显示博客文章而非newsletters,访问feed/?post_type=newsletters/仍返回博客文章
  • 其他CPT添加该代码后也出现相同问题:后台点击CPT菜单时,自定义文章列表被替换为博客文章列表
  • 新增问题:后台「所有新闻通讯」页面操作(如筛选错误的博客文章列表)时弹出「Invalid Post Type」错误,调用栈为wp_die() wp-admin/edit.php:18;新建草稿无法找到

移除has_archive => true后出现的问题

  • 「所有新闻通讯」页面恢复显示2篇newsletters,无博客文章
  • 归档页面domain/newsletters/出现404错误
  • RSS源无内容

相关注册代码

add_theme_support('post-thumbnails');
add_post_type_support( 'newsletters', 'thumbnail' ); 

add_action('init', function() {
    register_post_type('newsletters', [
        'label' => __('Newsletters', 'txtdomain'),
        'public' => true,
        'menu_icon' => 'dashicons-edit',
        'supports' => ['title', 'editor', 'thumbnail', 'author', 'revisions', 'comments', 'excerpt'],
        'show_in_rest' => true,
        'rewrite' => array('with_front' => false, 'slug' => 'newsletters'),
        'taxonomies' => ['newsletter_variety'], 
        'labels' => [
        'name'                  => _x( 'Newsletters', 'Post Type General Name', 'text_domain' ),
        'singular_name'         => _x( 'Newsletter', 'Post Type Singular Name', 'text_domain' ),
        'menu_name'             => __( 'Newsletters', 'text_domain' ),
        'name_admin_bar'        => __( 'Newsletter', 'text_domain' ),
        'archives'              => __( 'Newsletter Archives', 'text_domain' ),
        'attributes'            => __( 'Newsletter Attributes', 'text_domain' ),
        'parent_item_colon'     => __( 'Parent Item:', 'text_domain' ),
        'all_items'             => __( 'All Newsletters', 'text_domain' ),
        'add_new_item'          => __( 'Add New Newsletter', 'text_domain' ),
        'add_new'               => __( 'Add New', 'text_domain' ),
        'new_item'              => __( 'New Newsletter', 'text_domain' ),
        'edit_item'             => __( 'Edit Newsletter', 'text_domain' ),
        'update_item'           => __( 'Update Newsletter', 'text_domain' ),
        'view_item'             => __( 'View Newsletter', 'text_domain' ),
        'view_items'            => __( 'View Newsletters', 'text_domain' ),
        'search_items'          => __( 'Search Newsletter', 'text_domain' ),
        'not_found'             => __( 'Not found', 'text_domain' ),
        'not_found_in_trash'    => __( 'Not found in Trash', 'text_domain' ),
        'featured_image'        => __( 'Featured Image', 'text_domain' ),
        'set_featured_image'    => __( 'Set featured image', 'text_domain' ),
        'remove_featured_image' => __( 'Remove featured image', 'text_domain' ),
        'use_featured_image'    => __( 'Use as featured image', 'text_domain' ),
        'insert_into_item'      => __( 'Insert into newsletter', 'text_domain' ),
        'uploaded_to_this_item' => __( 'Uploaded to this newsletter', 'text_domain' ),
        'items_list'            => __( 'Newsletters list', 'text_domain' ),
        'items_list_navigation' => __( 'Newsletters list navigation', 'text_domain' ),
        'filter_items_list'     => __( 'Filter newsletters list', 'text_domain' ),
        ],      
    ]);
});

修复方案

1. 修正CPT注册参数

问题核心是has_archive配置与重写规则冲突,补充并调整参数如下:

add_action('init', function() {
    register_post_type('newsletters', [
        'label' => __('Newsletters', 'txtdomain'),
        'public' => true,
        'menu_icon' => 'dashicons-edit',
        'supports' => ['title', 'editor', 'thumbnail', 'author', 'revisions', 'comments', 'excerpt'],
        'show_in_rest' => true,
        'has_archive' => 'newsletters', // 明确指定归档slug,避免与默认post类型冲突
        'rewrite' => array(
            'with_front' => false, 
            'slug' => 'newsletters',
            'feeds' => true // 启用CPT专属RSS源
        ),
        'taxonomies' => ['newsletter_variety'], 
        'labels' => [
            // 保留原labels内容,无需修改
            'name'                  => _x( 'Newsletters', 'Post Type General Name', 'text_domain' ),
            'singular_name'         => _x( 'Newsletter', 'Post Type Singular Name', 'text_domain' ),
            'menu_name'             => __( 'Newsletters', 'text_domain' ),
            'name_admin_bar'        => __( 'Newsletter', 'text_domain' ),
            'archives'              => __( 'Newsletter Archives', 'text_domain' ),
            'attributes'            => __( 'Newsletter Attributes', 'text_domain' ),
            'parent_item_colon'     => __( 'Parent Item:', 'text_domain' ),
            'all_items'             => __( 'All Newsletters', 'text_domain' ),
            'add_new_item'          => __( 'Add New Newsletter', 'text_domain' ),
            'add_new'               => __( 'Add New', 'text_domain' ),
            'new_item'              => __( 'New Newsletter', 'text_domain' ),
            'edit_item'             => __( 'Edit Newsletter', 'text_domain' ),
            'update_item'           => __( 'Update Newsletter', 'text_domain' ),
            'view_item'             => __( 'View Newsletter', 'text_domain' ),
            'view_items'            => __( 'View Newsletters', 'text_domain' ),
            'search_items'          => __( 'Search Newsletter', 'text_domain' ),
            'not_found'             => __( 'Not found', 'text_domain' ),
            'not_found_in_trash'    => __( 'Not found in Trash', 'text_domain' ),
            'featured_image'        => __( 'Featured Image', 'text_domain' ),
            'set_featured_image'    => __( 'Set featured image', 'text_domain' ),
            'remove_featured_image' => __( 'Remove featured image', 'text_domain' ),
            'use_featured_image'    => __( 'Use as featured image', 'text_domain' ),
            'insert_into_item'      => __( 'Insert into newsletter', 'text_domain' ),
            'uploaded_to_this_item' => __( 'Uploaded to this newsletter', 'text_domain' ),
            'items_list'            => __( 'Newsletters list', 'text_domain' ),
            'items_list_navigation' => __( 'Newsletters list navigation', 'text_domain' ),
            'filter_items_list'     => __( 'Filter newsletters list', 'text_domain' ),
        ],      
    ]);
});

2. 刷新固定链接规则

修改CPT配置后必须刷新固定链接:

  • 进入后台「设置」→「固定链接」
  • 直接点击「保存更改」,无需修改任何设置,系统会自动更新重写规则(Nginx服务器需手动配置对应规则)

3. 修复后台列表查询异常

如果后台仍显示博客文章,添加以下代码强制修正查询:

add_action('pre_get_posts', function($query) {
    global $pagenow;
    // 仅针对后台Newsletters列表页面生效
    if (is_admin() && $pagenow === 'edit.php' && isset($_GET['post_type']) && $_GET['post_type'] === 'newsletters') {
        $query->set('post_type', 'newsletters');
        $query->is_post_type_archive = true;
    }
});

4. 确保模板正确加载

对于2024主题的全编辑器模板:

  • 在模板的查询块中明确设置post_type: newsletters
  • 若使用PHP模板,创建archive-newsletters.php文件,添加基础结构(可参考主题默认归档模板修改)

5. 验证RSS源

刷新固定链接后,访问domain/newsletters/feed/即可获取newsletters专属RSS源,无需使用feed/?post_type=newsletters格式。


内容的提问来源于stack exchange,提问作者serenity mclean

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 02:27:10