Como criar uma estrutura de permalink com taxonomias customizadas e tipos de post customizados como base-name / parent-tax / child-tax / custom-post-type-name

52

Eu estive vasculhando este site e pesquisei no google e cheguei completamente vazio. Basicamente eu quero fazer exatamente o que este post pede, mas eu preciso uma taxonomia hierárquica. A resposta dada nessa postagem funciona muito bem, mas apenas com uma taxonomia de nível único. É possível fazer o que eu quero? Eu tentei um milhão de coisas, mas nenhum funciona, na melhor das hipóteses eu posso obter os permalinks certos, mas eles aparecem em 404.

Para ilustrar visualmente o que eu quero:

/basename/ - ideally a page, but I think this will cause a permalink collision    
/basename/top-cat/ - top parent custom taxonomy archive    
/basename/top-cat/child-cat/ - child cat custom taxonomy archive     
/basename/top-cat/child-cat/grandchild-cat/ - grandchild cat custom taxonomy archive    
/basename/top-cat/child-cat/grandchild-cat/post-name/ - my custom post type post

Você pode fazer isso com as postagens e categorias incorporadas, como você faz isso com taxonomias personalizadas e tipos de postagem personalizados? Eu sei que você precisa usar 'rewrite' => array( 'slug' => 'tax-name', 'with_front' => true, 'hierarchical' => true ), para obter slugs hierárquicos, o que funciona bem nas páginas do arquivo, mas as postagens do tipo pós-postagem aparecem 404. Se eu remover a parte 'hierarchical' => true , as postagens funcionarão, mas perco o urls hierárquicos (somente / basename / grandchild-cat / post-name / works).

Então, alguma solução? Muito obrigado, isso tem me deixado louco por cerca de 3 semanas agora.

    
por Jeff 20.01.2012 / 01:37
fonte

2 respostas

64

Depois de combinar várias outras respostas, consegui que funcionasse! Então aqui está a solução para aqueles de vocês que estão lutando com isso também:

Esta postagem e este me ajudou um pouco, então graças a esses caras.

Observe que todo esse código, mais o tipo de postagem personalizado inicial e o código de registro de taxonomia estão no arquivo functions.php .

Primeiramente, prepare suas lesmas ao definir seus tipos de postagem e taxonomias personalizadas: para o tipo de postagem personalizada, ela deve ser basename/%taxonomy_name% e o espaçamento para sua taxonomia deve ser apenas basename . Não se esqueça de adicionar também 'hierarchical' => true ao array de reescrita de taxonomia para obter termos aninhados em seu URL. Verifique também se query_var está definido como true nos dois casos.

Você precisa adicionar uma nova regra de reescrita para que o WordPress saiba como interpretar sua estrutura de URL. No meu caso, a parte do tipo de postagem personalizada do uri sempre será o quinto segmento uri, então defini minha regra de correspondência de acordo. Note que você pode ter que mudar isso se você usar mais ou menos segmentos uri. Se você tiver níveis variados de termos aninhados, precisará escrever uma função para verificar se o último segmento uri é um tipo de postagem personalizado ou um termo de taxonomia para saber qual regra adicionar (pergunte se precisar de ajuda em que).

add_filter('rewrite_rules_array', 'mmp_rewrite_rules');
function mmp_rewrite_rules($rules) {
    $newRules  = array();
    $newRules['basename/(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php?custom_post_type_name=$matches[4]'; // my custom structure will always have the post name as the 5th uri segment
    $newRules['basename/(.+)/?$']                = 'index.php?taxonomy_name=$matches[1]'; 

    return array_merge($newRules, $rules);
}

Em seguida, você precisa adicionar esse código para permitir que o workpress manipule %taxonomy_name% em sua estrutura de slr de reescrita de tipo de postagem personalizada:

function filter_post_type_link($link, $post)
{
    if ($post->post_type != 'custom_post_type_name')
        return $link;

    if ($cats = get_the_terms($post->ID, 'taxonomy_name'))
    {
        $link = str_replace('%taxonomy_name%', get_taxonomy_parents(array_pop($cats)->term_id, 'taxonomy_name', false, '/', true), $link); // see custom function defined below
    }
    return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);

Eu criei uma função personalizada com base no próprio get_category_parents do Wordpress:

// my own function to do what get_category_parents does for other taxonomies
function get_taxonomy_parents($id, $taxonomy, $link = false, $separator = '/', $nicename = false, $visited = array()) {    
    $chain = '';   
    $parent = &get_term($id, $taxonomy);

    if (is_wp_error($parent)) {
        return $parent;
    }

    if ($nicename)    
        $name = $parent -> slug;        
else    
        $name = $parent -> name;

    if ($parent -> parent && ($parent -> parent != $parent -> term_id) && !in_array($parent -> parent, $visited)) {    
        $visited[] = $parent -> parent;    
        $chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited);

    }

    if ($link) {
        // nothing, can't get this working :(
    } else    
        $chain .= $name . $separator;    
    return $chain;    
}

Em seguida, você precisa liberar seus permalinks (basta carregar a página de configurações de permalinks).

Agora tudo 'deveria' funcionar esperançosamente! Vá fazendo um monte de termos de taxonomia e aninhe-os corretamente, então faça algumas postagens de tipo de postagem personalizadas e categorize-as corretamente. Você também pode criar uma página com o slug basename , e tudo deve funcionar da maneira que eu especifiquei na minha pergunta. Você pode criar algumas páginas de arquivo de taxonomia personalizadas para controlar a aparência e adicionar algum tipo de widget de taxonomia widget de taxonomia para mostrar suas categorias aninhadas na barra lateral.

Espero que ajude você!

    
por Jeff 23.01.2012 / 19:31
fonte
2

Dê uma olhada em este plugin . Ele fornece URLs hierárquicos para categorias, mas você pode adaptar-se facilmente a qualquer taxonomia.

A criação de regras segue uma função recursiva .

    
por vmassuchetto 17.09.2012 / 18:02
fonte