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.php
arquivo.
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_var
está definido 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 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ê!