WordPress自定义文章类型resource固定链接带/blog/的问题排查
咱们来一步步排查并解决你的resource自定义文章类型始终带有/blog/前缀的问题——毕竟其他CPT都正常,说明问题大概率出在resource的注册流程或者重写规则的生效环节上。
1. 调整旧Resource类型的删除时机
你当前在init钩子优先级5时执行unregister_post_type( 'resource' ),但如果原来的resource是在优先级5之后(比如常见的优先级10)才被注册的,那这时候执行删除根本找不到这个CPT,等于白删。后续原来的resource依然会被注册,并且可能带着默认的with_front => true参数,哪怕你后来在优先级99重新注册了自己的版本,也可能因为重写规则的缓存导致旧规则残留。
修复代码:
调整删除操作的钩子优先级,确保它在原来的resource注册之后执行,比如改成20:
add_action('init','delete_post_type', 20); function delete_post_type(){ unregister_post_type( 'resource' ); }
2. 正确刷新重写规则
你注释掉了flush_rewrite_rules();,而且即使打开,在init钩子上每次调用也会严重影响性能。推荐两种安全的刷新方式:
- 主题激活时自动刷新:在主题的
functions.php中添加以下代码(仅在主题激活时执行一次):
add_action( 'after_switch_theme', 'flush_my_rewrite_rules' ); function flush_my_rewrite_rules() { flush_rewrite_rules(); }
- 手动后台刷新:登录WordPress后台,进入设置 → 固定链接,无需修改任何设置,直接点击「保存更改」按钮——这会强制WordPress更新重写规则,比代码调用更稳妥。
3. 排查Slug冲突问题
如果你的站点里存在页面、分类或其他自定义文章类型的slug为resources(和你给resource设置的归档slug一致),会导致重写规则冲突,WordPress可能优先使用页面/分类的规则,从而让resource的URL异常。
检查步骤:
- 查看后台「页面」列表,确认是否有标题为
Resources的页面,其slug是否为resources; - 查看后台「分类」列表,确认是否有slug为
resources的分类; - 如果发现冲突,修改
resource的slug参数(比如改成resource-collection),重新注册后刷新规则即可。
4. 验证Resource注册参数的正确性
再核对一下你的resource注册调用:
custom_register_post_type( 'Resource', 'Resources', 'resource', 'resources', true, array( 'title', 'editor', 'thumbnail' ), true, array( 'category' ) );
这里传递的$slug为resources,最终生成的rewrite参数是array('slug' => 'resources' , 'with_front' => false),这个配置是完全正确的——只要前面的删除和刷新步骤都落实到位,这个参数就能正常生效。
完成以上调整后,再次测试resource文章的URL,应该就不会带有/blog/前缀了。
内容的提问来源于stack exchange,提问作者mdailey77

