Examinei todas as perguntas aqui nos permalinks personalizados de tipo de postagem, mas a maioria parece ter problemas com reescrições de taxonomia personalizada ou a falta óbvia de flush_rewrite_rules (). Mas, no meu caso, estou usando apenas um tipo de postagem personalizado (sem taxonomia), definido como hierárquico (para que eu possa atribuir relacionamentos pai-filho), com o "suporte" adequado para os atributos metabox, etc., etc. reescrevi regras de mil maneiras diferentes. Eu tentei diferentes estruturas permalink. Mas os URLs filhos sempre resultam em 404!
Originalmente, eu tinha tipos de postagem personalizados independentes para os elementos "pai" e "filho" (usando p2p) e provavelmente não teria problemas para usar uma taxonomia para o agrupamento "parental" - sei que esses seriam semanticamente mais precisos. Porém, para o cliente, é mais fácil visualizar a hierarquia quando as "postagens" são exibidas no administrador da mesma forma que as páginas: uma árvore simples em que os filhos aparecem embaixo do pai, prefixados com um "-" e no ordem correta. Além disso, vários métodos para atribuir ordem via arrastar e soltar podem ser usados. O agrupamento via taxonomia (ou p2p) resulta em uma lista simples de "postagens" nas listagens de administradores, o que simplesmente não é tão visualmente óbvio.
Então, o que eu busco é literalmente o mesmo comportamento das "páginas" principais, mas com o meu tipo de postagem personalizada. Registrei o tipo de postagem da maneira esperada e, no administrador, ele funciona perfeitamente - posso atribuir um pai e um menu_order para cada "postagem" do boletim informativo, eles aparecem corretamente nas listagens de edição:
Spring 2012
— First Article
— Second Article
E seus links permanentes parecem ter sido construídos adequadamente. De fato, se eu mudar alguma coisa sobre a estrutura ou alterar a lesma de reescrita ao registrar o tipo de postagem, eles serão atualizados automaticamente corretamente, então eu sei que algo está funcionando:
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 */
Também tenho "páginas" principais padrão com relacionamentos hierárquicos criados e têm a mesma aparência no administrador, mas também funcionam no front-end (os URLs pai e filho funcionam bem).
Minha estrutura de link permanente está definida como:
http://mysite.com/%postname%/
Eu também tentei isso (apenas porque muitas outras respostas pareciam indicar que era necessária, embora não fizesse sentido no meu caso):
http://mysite.com/%category%/%postname%/
Os argumentos do meu registro CPT incluem:
$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 ),
A única diferença visível entre meus filhos do tipo postagem personalizada e filhos da página normal é que meu CPT tem a lesma no início da estrutura do link permanente, seguido pelas lesmas pai / filho (onde as páginas apenas começam com as lesmas pai / filho, sem "prefixo"). Por que isso estragaria tudo, eu não sei. Muitos artigos parecem indicar que é exatamente assim que esses permalinks hierárquicos de CPT devem se comportar - mas os meus, embora bem formados, não funcionam.
O que também me deixa desconcertado é quando examino os query_vars para essa página 404 - eles parecem conter os valores corretos para o WP "encontrar" minhas páginas filhas, mas algo não está funcionando.
$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
[...]
Eu tentei isso com vários temas, incluindo vinte e doze, apenas para ter certeza de que não está faltando algum modelo da minha parte.
Usando o Rewrite Rules Inspector, é isso que aparece no 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:
como é exibido em outra página do inspetor:
RULE:
newsletter/(.+?)(/[0-9]+)?/?$
REWRITE:
index.php?newsletter=$matches[1]&page=$matches[2]
SOURCE:
newsletter
Essa saída de reescrita me levaria a acreditar que o seguinte link permanente "não bonito" funcionaria:
http://mysite.com/?newsletter=spring-2012&page=first-article
Não 404, mas mostra o item principal de CPT "boletim informativo", não o filho. A solicitação é assim:
Array
(
[page] => first-article
[newsletter] => spring-2012
[post_type] => newsletter
[name] => spring-2012
)
post_name
coluna.