Estou tentando configurar uma estrutura de tipo de postagem personalizada em vários níveis com links permanentes que parecem authors/books/chapters
com autores, livros e capítulos configurados como seu próprio tipo de postagem personalizada. Por exemplo, um URL típico neste site pode parecerexample.com/authors/stephen-king/the-shining/chapter-3/
Cada capítulo pode pertencer apenas a um livro e cada livro pode pertencer apenas a um autor. Considerei usar taxonomias em vez de CPTs para autores e livros, mas preciso associar metadados a cada item e prefiro a interface de postagem para isso.
Estou na maior parte do caminho, simplesmente configurando cada postagem personalizada como filho de uma entrada no CPT de um nível acima. Por exemplo, eu crio o "Capítulo 3" e atribuo "O Iluminado" como pai usando uma caixa de meta personalizada. "The Shining", por sua vez, tem "Stephen King" como pai. Não tive problemas para criar esses relacionamentos.
Estou usando tags de reescrita nas lesmas do CPT e os permalinks querem funcionar, mas eles não estão certos. Usando um analisador de reescrita, posso ver que as regras de reescrita são realmente geradas, mas elas não parecem estar na ordem correta e, portanto, outras regras são processadas primeiro.
Veja como eu registrei meus CPTs:
function cpt_init() {
$labels = array(
'name' => 'Authors'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array(
'slug' => 'author',
'with_front' => FALSE,
),
'with_front' => false,
'capability_type' => 'post',
'has_archive' => false,
'hierarchical' => true,
'menu_position' => null,
'supports' => array( 'title', 'editor' )
);
register_post_type('authors',$args);
$labels = array(
'name' => 'Books'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array(
'slug' => 'author/%authors%',
'with_front' => FALSE,
),
'with_front' => false,
'capability_type' => 'post',
'has_archive' => false,
'hierarchical' => true,
'menu_position' => null,
'supports' => array( 'title', 'editor' )
);
register_post_type('books',$args);
$labels = array(
'name' => 'Chapters'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array(
'slug' => 'author/%authors%/%books%',
'with_front' => FALSE,
),
'with_front' => FALSE,
'capability_type' => 'post',
'has_archive' => false,
'hierarchical' => true,
'menu_position' => null,
'supports' => array( 'title', 'editor' )
);
register_post_type('chapters',$args);
}
add_action( 'init', 'cpt_init' );
Existe alguma maneira de alterar a prioridade das minhas regras de reescrita para que autores, livros e capítulos sejam correspondidos primeiro?
Eu também sei que vou ter que adicionar um post_type_link
filtro, mas isso parece secundário para obter os permalinks corretamente em primeiro lugar. Se alguém souber onde posso encontrar uma visão abrangente de como esse filtro funciona, isso seria apreciado.
Respostas:
Se você deseja manter 'autores' como lesma de base nos permalinks, por exemplo , example.com/authors/stephen-king/ para o CPT dos autores, example.com/authors/stephen-king/the-shining/ para o CPT 'books' e example.com/authors/stephen-king/the-shining/chapter-3/ para o CPT 'capítulos', o WordPress pensará que praticamente tudo é um post de 'autores' ou um filho hierárquico de 'autores 'post e, como esse não é o caso, o WordPress acaba ficando muito confuso.
Com isso dito, há uma solução alternativa que é bastante básica, mas desde que sua estrutura de link permanente sempre siga a mesma ordem, ou seja, a palavra 'autores' é sempre seguida por uma lesma de autor, que é sempre seguida por uma lesma de livro que é sempre seguida por uma lesma de capítulo, então você deve estar pronto.
Nesta solução, não há necessidade de definir a lesma de reescrita na definição de tipo de postagem personalizada para 'capítulos' e 'livros', mas defina a 'lesma de reescrita dos autores como simplesmente' autores ', coloque o seguinte código em suas funções.php arquivar e "liberar" suas regras de reescrita.
Saiba mais sobre o plugin CPT-onomies
fonte
Não tenho experiência pessoal com esse cenário, mas Randy Hoyt fez uma apresentação no WordCamp San Fran, no final de semana passado, sobre "Subordinate Post Types", que soa como o que você está falando.
Aqui está sua página para a palestra, que inclui os slides da apresentação e os links para um plug-in que ele criou para trabalhar com tipos de postagem subordinados: http://randyhoyt.com/wordpress/subordinate-post-types/
fonte
As regras serão adicionadas ao extra_rules_top do WP_Rewrite na ordem em que as estruturas extras são adicionadas. Portanto, mudar a ordem em que você registra os tipos de postagem altera a ordem das regras de reescrita geradas, fazendo com que a reescrita do capítulo seja correspondida primeiro. No entanto, como você está usando o query_var dos outros post_types, o wp_query pode acabar correspondendo a um deles como o nome da postagem consultada antes de corresponder ao capítulo como você deseja.
Eu criaria novas tags de reescrita para representar os espaços reservados para o autor pai e o livro pai, ou seja:
Ao fazer isso, você precisará filtrar 'query_vars' para tornar público o 'parent_book'. Em seguida, você precisará adicionar um filtro aos pre_get_posts que converterá o nome definido como o parent_book query_var em post_id e o definirá como 'post_parent'.
fonte