it-swarm.dev

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

Eu tenho penteado este site e google para a resposta e eu vim completamente vazio. Basicamente eu quero fazer exatamente o que este post pede, mas preciso de uma taxonomia hierarquica. 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 nenhuma funciona, na melhor das hipóteses eu consigo os permalinks 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 os posts e categorias embutidos, como você faz isso com taxonomias personalizadas e tipos de post 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 arquivo, mas as mensagens do tipo pós-postagem aparecem 404. Se eu remover a parte 'hierarchical' => true, as postagens funcionarão, mas perco as URLs hierárquicas/basename/grandchild-cat/pós-nome/works).

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

53
Jeff

Depois de combinar um monte de 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:

Este post e este ajudou-me 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 em seu arquivo functions.php.

Primeiro, pegue suas lesmas corretamente ao definir seus tipos de postagens e taxonomias personalizadas: para o tipo de postagem personalizada, ela deve ser basename/%taxonomy_name% e o slug para sua taxonomia deve ser apenas 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_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 de tipo de postagem personalizada do uri sempre será o quinto segmento de 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 naquela).

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);
}

Então você precisa adicionar este 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 baseada 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;    
}

Então você precisa liberar seus permalinks (basta carregar sua página de configurações de permalinks).

Agora tudo 'deveria' funcionar esperançosamente! Ir fazer um monte de termos de taxonomia e aninhá-los corretamente, em seguida, fazer alguns posts do tipo post personalizado e categorizá-los 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 archive de taxonomia personalizadas para controlar a aparência e adicionar algum tipo de widget taxonomy plugin para mostrar suas categorias aninhadas na barra lateral.

Espero que ajude você!

68
Jeff

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 da regra segue uma função recursiva .

2
vmassuchetto