添加has_archive=true后WordPress自定义文章类型显示异常求助
问题背景
创建了名为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
相关产品推荐
相关产品推荐

