我在这里搜索了有关自定义帖子类型永久链接的每个问题,但大多数似乎是自定义分类法重写的问题,或者是flush_rewrite_rules()的明显缺失。但就我而言,我仅使用自定义帖子类型(无分类法),设置为分层(以便我可以分配父子关系),并为属性metabox提供适当的“支持”,等等。已经以一千种不同的方式刷新了重写规则。我尝试了不同的永久链接结构。但是子URL始终会显示404!
我最初为“父母”和“孩子”元素使用了独立的自定义帖子类型(使用p2p),使用“父母”分组的分类法可能不会遇到麻烦-我知道这些在语义上会更加准确。但是对于客户端而言,当管理员在页面中显示“帖子”时,就像页面一样,它们最容易可视化层次结构:一棵简单的树,其中子代出现在父代下方,前缀为“-”,正确的顺序。另外,可以使用通过拖放来分配顺序的各种方法。通过分类法(或p2p)进行分组会在管理员列表中生成“帖子”的平坦列表,这在视觉上根本不那么明显。
因此,我所追求的实际上是与核心“页面”完全相同的行为,但是具有我的自定义帖子类型。我已经按预期注册了帖子类型,并且在管理员中它可以正常运行-我可以为每个新闻稿“ post”分配一个父项和一个menu_order,它们会正确显示在编辑列表中:
Spring 2012
— First Article
— Second Article
而且它们的永久链接似乎已正确构建。实际上,如果我更改了结构的任何内容,或者甚至在注册帖子类型时更改了重写代码,它们都会自动正确更新,因此我知道某些工作正常:
http://mysite.com/parent-page/child-page/ /* works for pages! */
http://mysite.com/post-type/parent-post/child-post/ /* should work? */
http://mysite.com/newsletter/spring-2012/ /* works! */
http://mysite.com/newsletter/spring-2012/first-article/ /* 404 */
http://mysite.com/newsletter/spring-2012/second-article/ /* 404 */
我还创建了具有分层关系的标准核心“页面”,它们在管理中看起来相同,但是它们实际上也可以在前端工作(父URL和子URL都可以正常工作)。
我的永久链接结构设置为:
http://mysite.com/%postname%/
我也尝试过此操作(只是因为很多其他答案似乎都表明需要这样做,尽管对我而言这没有意义):
http://mysite.com/%category%/%postname%/
我的注册CPT参数包括:
$args = array(
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'has_archive' => 'newsletter',
'hierarchical' => true,
'query_var' => true,
'supports' => array( 'title', 'editor', 'thumbnail', 'page-attributes' ),
'rewrite' => array( 'slug' => 'newsletter', 'with_front' => false ),
我的自定义帖子类型子项和普通页面子项之间唯一可见的区别是,我的CPT在永久链接结构的开头有一个子弹,然后是父子子弹(其中页面仅以父子子弹开始,没有“前缀”)。我不知道为什么这会使事情搞砸了。大量文章似乎表明,这正是这种层次结构的CPT永久链接应具有的行为-但是我的尽管格式很好,但是却不起作用。
当我检查该404页的query_vars时,我也感到困惑。它们似乎包含正确的WP值,以“查找”我的子页,但是某些方法不起作用。
$wp_query object WP_Query {46}
public query_vars -> array (58)
'page' => integer 0
'newsletter' => string(25) "spring-2012/first-article"
'post_type' => string(10) "newsletter"
'name' => string(13) "first-article"
'error' => string(0) ""
'm' => integer 0
'p' => integer 0
'post_parent' => string(0) ""
'subpost' => string(0) ""
'subpost_id' => string(0) ""
'attachment' => string(0) ""
'attachment_id' => integer 0
'static' => string(0) ""
'pagename' => string(13) "first-article"
'page_id' => integer 0
[...]
我已经尝试过各种主题,包括二十二个主题,只是为了确保它不是我所缺少的模板。
使用重写规则检查器,URL中将显示以下内容:http : //mysite.com/newsletter/spring-2012/first-article/
newsletter/(.+?)(/[0-9]+)?/?$
newsletter: spring-2012/first-article
page:
(.?.+?)(/[0-9]+)?/?$
pagename: newsletter/spring-2012/first-article
page:
它如何在另一个检查器页面上显示:
RULE:
newsletter/(.+?)(/[0-9]+)?/?$
REWRITE:
index.php?newsletter=$matches[1]&page=$matches[2]
SOURCE:
newsletter
此重写输出将使我相信以下“非漂亮”永久链接将起作用:
http://mysite.com/?newsletter=spring-2012&page=first-article
它不是404,但显示的是父CPT项目“新闻通讯”,而不是子项。该请求看起来像这样:
Array
(
[page] => first-article
[newsletter] => spring-2012
[post_type] => newsletter
[name] => spring-2012
)
post_name
列中没有冲突。