在WordPress中如果注册一个自定义文章类型(Custom Post Type),并且同时为这个类型注册一个自定义分类法(Custom Taxonomy),两者使用同一个根slug,访问这个类型的页面就会发生404报错。
以上URL分别作为product类型页面的详情页和分类列表页,URL中的product就是根slug。在使用register_post_type注册product文章类型的时候,代码体现为:
注意第11行的rewrite参数,就为此自定义类型指定了根slug,即形成如下url:
再来注册自定义分类法,这里的分类法名称为product_category:
注意第10行的rewrite参数,为此自定义分类指定了根slug,即形成如下url:
但实际上我们注册完毕后,前端页面会在自定义分类的URL产生404报错。
假如去掉第10行代码,默认的slug会变成product_category,即分类名称,这时候url会变成
这样虽然不会报错,但url比较难看,也不利于SEO。
要解决这个问题,需要在注册自定义类型的时候,修改参数如下:
最后,在post_type_link钩子上添加代码根据类型名称替换实际生成的url:
如此,两个url就能和平共处了。这个问题的修复逻辑是这样的:因在两处注册rewrite的时候使用同一个slug名,会造成rewrite冲突,产生404报错,那么我们就避免使用相同的slug,把第一处的slug改成’product/%product_category%’绕开这个问题。在实际生成url的时候再把类型名替换’%product_category%’字符串,从而解决问题。
能保护好大哥,我已经很满足了。