我在这里仔细研究了关于自定义post类型permalinks的所有问题,但大多数问题似乎要么是自定义分类法重写的问题,要么是flush\\u rewrite\\u rules()的明显缺失。但在我的例子中,我只使用了一个自定义的post类型(没有分类法),设置为层次结构(这样我就可以分配父子关系),并对属性metabox等进行了适当的“支持”。我用了一千种不同的方式刷新了重写规则。我尝试过不同的permalink结构。但子URL总是导致404!
我最初为“parent”和“child”元素提供了独立的自定义post类型(使用p2p),并且我可能在为“parent”分组使用分类法时不会遇到任何问题-我知道这些分类法在语义上更准确。但对于客户端来说,当“帖子”像页面一样显示在管理中时,他们最容易看到层次结构:一个简单的树,其中子级显示在父级下方,前缀为“-”,并按正确的顺序排列。此外,还可以使用各种通过拖放指定顺序的方法。通过分类法(或p2p)分组会在管理列表中形成一个简单的“帖子”列表,这在视觉上并不明显。
因此,我追求的是与核心“页面”完全相同的行为,但我的自定义帖子类型。我已经按预期注册了帖子类型,在管理中效果很好-我可以为每个新闻稿“post”指定一个父级和一个menu\\u顺序,它们会正确显示在编辑列表中:
Spring 2012
— First Article
— Second Article
它们的永久线似乎构造得很好。事实上,如果我更改了结构的任何内容,甚至在注册post类型时更改了重写slug,它们会自动正确更新,因此我知道有什么在起作用:
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在永久链接结构的开头有slug,然后是父/子slug(其中页面仅以父/子slug开头,没有“前缀”)。我不知道为什么这会把事情搞砸。大量的文章似乎表明,这正是这种层次化CPT永久链接应该如何表现的——但我的,虽然结构良好,但不起作用。
同样让我困惑的是,当我检查404页面的query\\u 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
这个重写输出会让我相信以下“不漂亮”的permalink会起作用:
http://mysite.com/?newsletter=spring-2012&page=first-article
它不是404,但它显示的是父CPT项目“新闻稿”,而不是子CPT项目。请求如下所示:
Array
(
[page] => first-article
[newsletter] => spring-2012
[post_type] => newsletter
[name] => spring-2012
)