Você sempre pode substituir o modelo que será chamado com template_include
ou um filtro relacionado, mas isso pode ocultar problemas mais profundos com arquivos personalizados.
Pelo que entendi, você quer usar a seguinte estrutura:
-
/glossary/
deve ser uma página de arquivo para todos ossumo-glossary-term
posts -
/glossary/[letter]/
deve ser uma página de arquivo para postagens com o termo de taxonomia[letter]
nasumo-glossary-letter
taxonomy -
/glossary/[letter]/[term-name]/
deve ser individualsumo-glossary-term
post
Isso significa que o primeiro carregará o modelo archive-sumo-glossary-term.php
, o segundo carregará taxonomy-sumo-glossary-letter.php
e o terceiro carregará single-sumo-glossary-term.php
.
Eu consegui isso no WordPress 3.2 definindo explicitamente o slug de reescrita de taxonomia, e o slug de reescrita e o slug de arquivo para o tipo de post, e nenhuma outra regra de reescrita. Além disso, registrei a taxonomia primeiro e depois o tipo de postagem, para garantir que as prioridades estavam corretas (caso contrário, uma URL como /glossary/f/page/2
vai para o termo do glossário page
em vez da página 2 do glossário letter f
). p>
add_action('init', 'create_glossary');
function create_glossary()
{
register_taxonomy
(
'sumo-glossary-letter',
array(),
array
(
'hierarchical' => true,
'labels' => array
(
'name' => _x('Letters', 'taxonomy general name'),
'singular_name' => _x('Letter', 'taxonomy singular name')
# And so one
),
'show_ui' => true,
'query_var' => 'glossary-letter',
'rewrite' => array(
'slug' => 'glossary',
),
)
);
register_post_type
(
'sumo-glossary-term',
array
(
'labels' => array
(
'name' => _x('Glossary Terms', 'post type general name'),
'singular_name' => _x('Glossary Term', 'post type singular name')
# And so on …
),
'supports' => array('title', 'editor', 'thumbnail'),
'public' => true,
'rewrite' => array
(
'slug' => 'glossary/%sumo-glossary-letter%',
'with_front' => false
),
'query_var' => 'glossary-term',
'has_archive' => 'glossary',
'taxonomies' => array( 'sumo-glossary-letter' ),
)
);
}
add_filter('post_type_link', 'glossary_term_permalink', 10, 4);
function glossary_term_permalink($post_link, $post, $leavename, $sample)
{
if ( false !== strpos( $post_link, '%sumo-glossary-letter%' ) ) {
$glossary_letter = get_the_terms( $post->ID, 'sumo-glossary-letter' );
$post_link = str_replace( '%sumo-glossary-letter%', array_pop( $glossary_letter )->slug, $post_link );
}
return $post_link;
}