WordPress自定义post_type_link生效但单页面跳转404求助
自定义文章类型 permalink 404 问题解决方案
问题根源
你修改了自定义文章类型的 permalink 结构,但未给 WordPress 配置对应的URL解析规则,同时代码里存在几个细节错误,导致访问触发404。
具体修复步骤
1. 修正post_type_link钩子函数
原函数里用get_the_ID()不可靠,优先级设置过低,且str_replace属于冗余写法,直接修改如下:
function tpcl_post_permalinks( $post_link, $post ) { // 直接使用钩子传入的post对象ID,避免上下文错误 $tpcl_meta = get_post_meta( $post->ID, '_tpcl_post_tmeta', true ); if ( 'tpcl_mtr' === $post->post_type ) { $permalink = home_url( 'tpcl/'. $tpcl_meta . '/mtr/' . $post->post_name ); } elseif ( 'tpcl_utr' === $post->post_type ){ $permalink = home_url( 'tpcl/'. $tpcl_meta . '/utr/' ); } else{ $permalink = $post_link; } return $permalink; } // 调高优先级到10,确保覆盖默认行为 add_filter('post_type_link', 'tpcl_post_permalinks', 10, 2);
2. 添加重写规则
让WordPress能识别你自定义的URL结构,添加对应解析规则:
function tpcl_add_rewrite_rules() { // 匹配 tpcl/{自定义字段值}/mtr/{文章别名} 结构,映射到tpcl_mtr类型文章 add_rewrite_rule( '^tpcl/([^/]+)/mtr/([^/]+)/?$', 'index.php?post_type=tpcl_mtr&name=$matches[2]', 'top' ); // 匹配 tpcl/{自定义字段值}/utr/ 结构,映射到tpcl_utr类型文章 // 注意:需保证_tpcl_post_tmeta的值对每个tpcl_utr文章唯一,否则会出现匹配冲突 add_rewrite_rule( '^tpcl/([^/]+)/utr/?$', 'index.php?post_type=tpcl_utr&meta_key=_tpcl_post_tmeta&meta_value=$matches[1]', 'top' ); } add_action( 'init', 'tpcl_add_rewrite_rules' );
3. 调整自定义文章类型注册配置
注册时关闭rewrite的with_front选项,避免和默认固定链接前缀冲突:
function tpcl_custom_post_types() { register_post_type( 'tpcl_mtr', array( 'public' => true, 'query_var' => true, 'rewrite' => array( 'slug' => 'tpclmtr', 'with_front' => false ), 'hierarchical' => true, 'supports' => array('title', 'editor', 'thumbnail') ) ); register_post_type( 'tpcl_utr', array( 'public' => true, 'query_var' => true, 'rewrite' => array( 'slug' => 'tpclutr', 'with_front' => false ), 'hierarchical' => true, 'supports' => array('title', 'editor', 'thumbnail') ) ); } add_action( 'init', 'tpcl_custom_post_types' );
4. 刷新固定链接缓存
完成代码修改后,登录WordPress后台进入设置→固定链接,无需修改任何选项,直接点击「保存更改」。这一步会刷新WordPress的重写规则缓存,让新配置生效。
额外提示
- 若
tpcl_utr的URL需要包含文章别名以避免冲突,可将permalink生成代码改为home_url( 'tpcl/'. $tpcl_meta . '/utr/' . $post->post_name ),同时把对应的重写规则调整为:add_rewrite_rule( '^tpcl/([^/]+)/utr/([^/]+)/?$', 'index.php?post_type=tpcl_utr&name=$matches[2]', 'top' );
内容的提问来源于stack exchange,提问作者Mary X Nabors
相关产品推荐
相关产品推荐

