Después de combinar un montón de otras respuestas, ¡lo tengo funcionando! Así que aquí está la solución para aquellos de ustedes que están luchando con esto también:
Esta publicación y this me ayudó un poco, así que gracias a esos tipos.
Tenga en cuenta que todo este código, más su tipo de publicación personalizada inicial y el código de registro de taxonomía van en su archivo functions.php
.
Primero, consiga sus slugs al definir sus tipos de correos personalizados y taxonomías: para el tipo de post personalizado debe ser basename/%taxonomy_name%
y el slug para su taxonomía debe ser solo basename
. No olvide también agregar 'hierarchical' => true
a la matriz de reescritura de taxonomía para obtener términos anidados en su url. También asegúrese de que query_var
esté configurado en true
en ambos casos.
Debe agregar una nueva regla de reescritura para que WordPress sepa cómo interpretar la estructura de su URL. En mi caso, la parte de tipo de publicación personalizada de uri siempre será el quinto segmento de uri, por lo que definí mi regla de coincidencia en consecuencia. Tenga en cuenta que puede tener que cambiar esto si usa más o menos segmentos de uri. Si tendrá distintos niveles de términos anidados, deberá escribir una función para verificar si el último segmento de uri es un tipo de publicación personalizado o un término de taxonomía para saber qué regla agregar (pregúnteme si necesita ayuda en 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);
}
Luego, debe agregar este código para que Workpress pueda manejar %taxonomy_name%
en la estructura de la barra de reescritura de tipo de entrada 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);
Creé una función personalizada basada en el propio get_category_parents
de 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;
}
Luego debes vaciar tus enlaces permanentes (solo carga la página de configuración de enlaces permanentes).
¡Ahora todo 'debería' funcionar con suerte! Vaya a hacer un montón de términos de taxonomía y anídelos correctamente, luego haga algunas publicaciones de tipo de publicación personalizadas y clasifíquelas correctamente. También puede hacer una página con el slug basename
, y todo debería funcionar como especifiqué en mi pregunta. Es posible que desee crear algunas páginas de archivo de taxonomía personalizadas para controlar su apariencia y agregar algún tipo de complemento de taxonomía para mostrar sus categorías anidadas en la barra lateral.
Espero que te ayude!