Después de combinar un montón de piezas de otras respuestas, ¡lo hice funcionar! Así que aquí está la solución para aquellos de ustedes que también están luchando con esto:
Esta publicación y esta me ayudaron un poco, así que gracias a esos muchachos.
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 functions.php
archivo.
Primero obtenga las babosas correctas al definir sus tipos de publicaciones y taxonomías personalizadas: para el tipo de publicación personalizada debe ser basename/%taxonomy_name%
y la babosa para su taxonomía debe ser justa basename
. No olvide agregar también '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 true
en ambos casos.
Debe agregar una nueva regla de reescritura para que WordPress sepa cómo interpretar su estructura de URL. En mi caso, la parte de tipo de publicación personalizada de la uri siempre será el quinto segmento de uri, por lo que definí mi regla de coincidencia en consecuencia. Tenga en cuenta que es posible que tenga que cambiar esto si usa más o menos segmentos uri. Si tendrá varios niveles de términos anidados, deberá escribir una función para verificar si el último segmento 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 sobre ese).
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 permitir que workpress maneje %taxonomy_name%
en su estructura de reescritura de tipo de publicación 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 la propia de 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;
}
Luego debe vaciar sus enlaces permanentes (solo cargue 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 anidelos correctamente, luego haga algunas publicaciones de tipo de publicación personalizada y clasifíquelas correctamente. También puede hacer una página con la babosa basename
, y todo debería funcionar de la manera que especifiqué en mi pregunta. Es posible que desee crear algunas páginas de archivo de taxonomía personalizadas para controlar su aspecto y agregar algún tipo de complemento de widget de taxonomía para mostrar sus categorías anidadas en la barra lateral.
Espero que te ayude!