Cómo crear una estructura de enlace permanente con taxonomías personalizadas y tipos de publicación personalizados como nombre base / impuesto-padre / impuesto-hijo / nombre-tipo-publicación personalizado

53

He estado buscando en este sitio y en Google la respuesta y he quedado completamente vacío. Básicamente quiero hacer exactamente lo que esta publicación me pide, pero necesito una taxonomía jerárquica. La respuesta dada en esa publicación funciona muy bien, pero solo con una taxonomía de un solo nivel. ¿Es posible hacer lo que quiero? He intentado un millón de cosas, pero ninguna funciona, en el mejor de los casos puedo obtener los enlaces permanentes correctos pero aparecen 404.

Para ilustrar visualmente lo que quiero:

/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

Puede hacerlo bien con las publicaciones y categorías integradas, ¿cómo lo hace con taxonomías personalizadas y tipos de publicaciones personalizadas? Sé que debe usarlo 'rewrite' => array( 'slug' => 'tax-name', 'with_front' => true, 'hierarchical' => true ),para obtener slugs jerárquicos, que funcionan bien en las páginas de archivo, pero las publicaciones de tipo de publicación personalizada aparecen 404. Si elimino la 'hierarchical' => trueparte, las publicaciones funcionan, pero pierdo las URL jerárquicas (solo / basename / grandchild-cat / post-name / works).

Entonces, ¿alguna solución? Muchas gracias, esto me ha estado volviendo loco durante aproximadamente 3 semanas.

Jeff
fuente

Respuestas:

68

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.phparchivo.

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' => truea la matriz de reescritura de taxonomía para obtener términos anidados en su url. También asegúrese de que query_varesté configurado trueen 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!

Jeff
fuente
Solucionado, ver pregunta. Jeff, gracias por tu explicación! Pero, ¿podría ser posible que publique la compilación de tipo / taxonomía personalizada? ¿Entonces puedo ver lo que estoy haciendo mal ? Estaría realmente agradecido!
Reitze Bos
Hola Jeff, gracias por tu respuesta! Ya casi estoy allí, después de 4 horas peleando con esto. Mi único problema es que obtengo una doble barra antes del nombre de la publicación (como este: portfolio / diseno-grafico-2 / logo // alquimia-sonora /) ¿Me pueden ayudar?
Cmorales
1
@Cmorales, no estoy seguro sin ver su código, pero busque un lugar donde defina manualmente una barra inclinada antes de su nombre de publicación, como quizás el registro de slug cpt o en la función filter_post_type. Si no puede rastrear dónde está agregando la barra oblicua adicional, puede simplemente quitar el último carácter del valor devuelto de la función get_taxonomy_parents llamada filter_post_type_link, porque eso lo dejará con una barra diagonal final, que es la primera de el doble. Buena suerte.
Jeff
1
"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 en eso) ... "Bueno, ¿me pueden ayudar, por favor? :)
Cmorales
2
^ eso es exactamente lo que necesitaba. ¿Alguien sabe como hacerlo? vea mi pregunta aquí: wordpress.stackexchange.com/questions/102246/…
reikyoushin
2

Echa un vistazo a este complemento . Proporciona URL jerárquicas para categorías, pero puede adaptarse fácilmente a cualquier taxonomía.

La creación de la regla sigue una función recursiva .

vmassuchetto
fuente
2
Este complemento ya no está disponible.
Enkode