Como criar uma estrutura de link permanente com taxonomias personalizadas e tipos de postagem personalizados, como nome-base / imposto-pai / imposto-filho / imposto-filho / nome-de-postagem-personalizado

53

Eu tenho vasculhado este site e o google pela resposta e vim completamente vazio. Basicamente, quero fazer exatamente o que este post pede, mas preciso de uma taxonomia hierárquica. A resposta dada nesse post 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 nenhuma funciona, na melhor das hipóteses eu posso obter os links permanentes certos, mas eles aparecem 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 bem com as postagens e categorias integradas. Como você faz 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 de arquivamento, mas as postagens do tipo de postagem personalizada aparecem 404. Se eu remover a 'hierarchical' => trueparte, as postagens funcionam, mas perco os URLs hierárquicos (somente / basename / neto-gato / pós-nome / obras).

Então, alguma solução? Muito obrigado, isso me deixa louco há cerca de três semanas.

Jeff
fonte

Respostas:

68

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

Este post e este me ajudaram um pouco, então obrigado a esses caras.

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

Primeiro, conserte suas lesmas corretamente ao definir seus tipos e taxonomias personalizados de postagem: para o tipo de postagem personalizada, deve ser basename/%taxonomy_name%e a lesma para sua taxonomia deve ser justa basename. Não se esqueça de adicionar também 'hierarchical' => trueà matriz de reescrita de taxonomia para obter termos aninhados em seu URL. Verifique também se query_varestá definido truenos 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 da uri sempre será o quinto segmento da uri, por isso defini minha regra de correspondência de acordo. Observe que você pode precisar alterar isso se usar mais ou menos segmentos de URI. Se você tiver vários níveis de termos aninhados, precisará escrever uma função para verificar se o último segmento de URI é um tipo de postagem personalizado ou um termo de taxonomia para saber qual regra adicionar (pergunte-me se precisar de ajuda sobre este).

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, é necessário adicionar esse código para permitir que a imprensa trabalhe como manipular %taxonomy_name%sua estrutura de slug 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);

Criei uma função personalizada baseada no próprio Wordpress get_category_parents:

// 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 links permanentes (basta carregar sua página de configurações de links permanentes).

Agora tudo deve "funcionar" com esperança! Vá criar vários termos de taxonomia e aninhá-los corretamente, depois faça alguns posts personalizados do tipo de postagem e categorize-os corretamente. Você também pode criar uma página com a lesma basename, e tudo deve funcionar da maneira especificada na minha pergunta. Você pode criar algumas páginas de arquivo de taxonomia personalizadas para controlar a aparência delas e adicionar algum tipo de plug-in de widget de taxonomia para mostrar suas categorias aninhadas na barra lateral.

Espero que ajude você!

Jeff
fonte
Corrigido - veja a pergunta. Jeff, obrigado pela sua explicação! Mas será possível publicar a compilação personalizada de tipo de post / taxonomia? Para que eu possa ver o que estou fazendo de errado ? Seria muito grato!
Reitze Bos
Hey Jeff, obrigado pela sua resposta! Estou quase lá, depois de 4 horas lutando com isso. Meu único problema é que recebo uma barra dupla antes do nome da postagem (como este: portfolio / diseno-grafico-2 / logo // alquimia-sonora /) Você pode me ajudar?
precisa saber é o seguinte
11
@Cmorales, Não tenho certeza sem ver seu código, mas procure um lugar onde você defina manualmente uma barra antes do nome da postagem, como talvez o registro de slug cpt ou a função filter_post_type? Se você não conseguir rastrear onde está adicionando a barra extra, basta retirar o último caractere do valor retornado da função get_taxonomy_parents chamada filter_post_type_link, porque isso deixará uma barra final, que é a primeira de o dobro. Boa sorte.
9114 Jeff
11
"Se você tiver vários níveis de termos aninhados, precisará escrever uma função para verificar se o último segmento de URI é um tipo de postagem personalizado ou um termo de taxonomia para saber qual regra adicionar (pergunte-me se precisar de ajuda nisso) ... "Bem, você pode me ajudar, por favor? :)
Cmorales
2
^ isso é exatamente o que eu precisava. Alguém sabe como fazer isso? veja minha pergunta aqui: wordpress.stackexchange.com/questions/102246/…
reikyoushin
2

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

A criação da regra segue uma função recursiva .

vmassuchetto
fonte
2
Este plugin não está mais disponível.
Enkode