Misturando estruturas de tipo de postagem e taxonomia personalizadas reescrever?

30

Basicamente, quero obter um glossário usando tipos de postagem personalizados e ter alguns problemas de configuração reescrevendo da maneira que quero que sejam. Eu quero assim:

O principal URL do glossário: http://example.com/glossary/

Termos do glossário que começam com a letra A : http://example.com/glossary/a/

O URL para um único termo do glossário: http://example.com/glossary/a/atomic/

Eu realmente consegui isso usando o código abaixo, mas tenho certeza de que é uma maneira muito incômoda de fazê-lo e sei que está funcionando mal em algum lugar, pois os modelos errados são chamados ao visualizar as páginas. Exceto por http://example.com/glossary/ , em que archive-sumo-glossary-term.php é chamado conforme o esperado, os outros dois ativam o index.php no meu tema.

Aqui vai ( functions.phpno tema):

add_action('init', 'create_glossary');
function create_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',
                'with_front' => false

            ),
            'query_var' => 'glossary-term',
            'has_archive' => true
        )
    );

    register_taxonomy
    (
        'sumo-glossary-letter',
        'sumo-glossary-term',
        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' => false
        )
    );
}

add_filter('post_type_link', 'glossary_term_permalink', 10, 4);
function glossary_term_permalink($post_link, $post, $leavename, $sample)
{
    if ($post->post_type == 'sumo-glossary-term')
    {
        $permalink = str_replace('glossary/', 'glossary/' . $post->post_name[0] . '/', $post_link);
    }
    return $permalink;
}

add_rewrite_rule('^glossary/([^/]*)?$','index.php?glossary-letter=$matches[1]','top');
add_rewrite_rule('^glossary/([^/]*)/([^/]*)?$','index.php?glossary-term=$matches[2]','top');
maryisdead
fonte

Respostas:

30

Você sempre pode substituir o modelo que será chamado com o template_includefiltro ou com um filtro relacionado, mas isso pode ocultar problemas mais profundos com arquivos personalizados.

Pelo que entendi, você deseja usar a seguinte estrutura:

  • /glossary/deve ser uma página de arquivo para todas as sumo-glossary-termpostagens
  • /glossary/[letter]/deve ser uma página de arquivo para postagens com o termo taxonomia [letter]na sumo-glossary-lettertaxonomia
  • /glossary/[letter]/[term-name]/deve ser um sumo-glossary-termpost individual

Isso significa que o primeiro carregará o modelo archive-sumo-glossary-term.php, o segundo carregará taxonomy-sumo-glossary-letter.phpe o terceiro carregará single-sumo-glossary-term.php.

Consegui isso no WordPress 3.2, definindo explicitamente a lesma de reescrita da taxonomia e a lesma de reescrita e a do arquivo para o tipo de postagem e nenhuma outra regra de reescrita. Além disso, registrei a taxonomia primeiro e o tipo de postagem depois dela, para garantir que as prioridades fossem corretas (caso contrário, um URL como /glossary/f/page/2vai para o termo do glossário em pagevez da página 2 da carta do glossário f).

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;
}
Jan Fabry
fonte
Vou tentar amanhã e ver se dá certo e voltar aqui. Obrigado!
Maryisdead 9/07
Ok, não exatamente para amanhã… Funcionou quase perfeitamente! Obrigado! O que não está funcionando é /glossary/. Dá-me um 404 ( archive-sumo-glossary-term.phpestá configurado). Alguma ideia? Tenho que dizer que estou preso ao WP 3.0.1 e talvez seja um problema de versão. Preciso testá-lo novamente quando eu puder atualizar. De qualquer forma, na maioria das vezes está funcionando e, por enquanto, não preciso necessariamente /glossary/e apenas redireciono para a letra A. Obrigado novamente!
Maryisdead 16/07
hey @maryisdead, eu tive exatamente o mesmo problema e encontrei exatamente a mesma solução, mas fiquei com o mesmo problema - como você obtém / glossário para acessar o modelo archive-glossery.php? Acabei de encontrar a resposta - use 'has_archive' => 'glossary', em vez de has_archive => true apenas notar que Jan tem a mesma resposta, mas você não a encontra no código original - atualizou essa parte? Ele começou a trabalhar para mim assim que eu fiz essa mudança
Jeff
Hey Jeff! Sim, atualizei essa parte. Apenas verificado novamente, ainda não está funcionando. A instalação do WordPress em questão ainda não está atualizada (3.0.1), então talvez essa ainda seja a raiz do problema.
21812 maryisdead
O mesmo problema aqui, usando o WP 3.2.1. Ainda sem solução?
Richard B
0

Eu não usei isso pessoalmente, mas o que você pode querer considerar é "add_rewrite_rule"

http://codex.wordpress.org/Rewrite_API/add_rewrite_rule

também não se esqueça de salvar os permalinks depois de alterá-los.

eeMZee
fonte
Na verdade add_rewrite_rule, eu uso , basta rolar meu código para baixo. :-) Até agora, está funcionando bem, apenas os modelos errados são chamados com essa maneira de fazê-lo.
Maryisdead