Cómo habilitar enlaces permanentes jerárquicos para taxonomías jerárquicas

16 may 2011, 01:08:49
Vistas: 18.1K
Votos: 3

Si tienes una categoría llamada "término" y una subcategoría llamada "subtérmino", puedes acceder a los posts del subtérmino en /categoria/subcategoria. Pero esto no funciona por defecto con taxonomías personalizadas. Estas son accesibles en /taxonomia/subtermino, pero no en /taxonomia/termino/subtermino.

Este tema se ha tratado en el Wordpress Trac (http://core.trac.wordpress.org/ticket/12659), y parece que tienen una solución, pero como nunca he usado el Trac y no entiendo completamente su lenguaje (diffs, etc.), necesito que alguien con más experiencia me explique cómo implementarlo. ¿Hay código allí que deba pegar en los archivos del núcleo de WordPress? ¿Esto ya está implementado y puedo añadir algo al functions.php de mi tema?

Si es posible, preferiría no modificar ningún archivo del núcleo. ¡Ayuda!

0
Todas las respuestas a la pregunta 4
5
11

Esto está implementado en WordPress desde la versión 3.1.

Cuando registras tu taxonomía, asegúrate de establecer rewrite hierarchical como verdadero, así como la taxonomía misma:

<?php
register_taxonomy('genre',array('book'), array(
'hierarchical' => true, // esto lo hace jerárquico en la interfaz de usuario
'labels' => $labels,
'show_ui' => true,
'query_var' => true,
'rewrite' => array( 'hierarchical' => true ), // esto crea URLs jerárquicas
));
16 may 2011 01:42:31
Comentarios

¿Existe alguna manera de agregar un parámetro a una taxonomía personalizada ya registrada? Todas mis taxonomías fueron construidas con un plugin, así que sería genial si pudiera agregar algo a functions.php que simplemente añada 'rewrite' => array( 'hierarchical' => true ) a esas taxonomías.

supertrue supertrue
16 may 2011 02:06:17

Todavía estoy buscando la respuesta a esta pregunta—ver http://wordpress.stackexchange.com/questions/17444/add-overwrite-a-parameter-on-an-existing-post-type-taxonomy

supertrue supertrue
17 may 2011 18:50:30

Probablemente sea más sencillo agregar las taxonomías tú mismo y no usar el plugin.

Milo Milo
17 may 2011 18:54:08

El problema es que trabajo con otras personas que necesitan la interfaz gráfica (GUI). El parámetro de reescritura jerárquica es lo único que muchos de estos plugins aún no admiten.

supertrue supertrue
17 may 2011 23:21:33

@supertrue - ¿necesitan poder registrar taxonomías a través de una GUI? Una vez que registras una taxonomía, podrán usar la GUI para administrar términos. Solo me aseguro de que no haya confusión aquí - nunca me he encontrado con una situación donde nuevas taxonomías necesitaran añadirse tan frecuentemente. Una taxonomía completa, no solo términos dentro de la taxonomía.

Milo Milo
18 may 2011 01:35:15
0

¿Hay alguna forma de agregar un parámetro a una taxonomía personalizada ya registrada? Todas mis taxonomías fueron creadas con un plugin, así que sería genial si pudiera agregar algo a functions.php que simplemente añada 'rewrite' => array( 'hierarchical' => true ) a esas taxonomías.

Deberías poder usar register_taxonomy para volver a registrar la taxonomía que deseas modificar.

http://core.trac.wordpress.org/browser/tags/3.4.2/wp-includes/taxonomy.php#L305

ADVERTENCIA: ¡Código no probado!
(Solo de memoria, principalmente. No me hago responsable por sitios rotos.):

function reregister_taxonomy() {
    # los tipos de post a los que está registrada la taxonomía
    $post_types = array('post');
    # establece esto al nombre de la taxonomía
    $tax_name = 'TAXONOMY_NAME_TO_CHANGE';
    # carga la taxonomía ya creada como array para poder
    # pasarla de nuevo como $args a register_taxonomy
    $tax = (array)get_taxonomy($tax_name);

    if ($tax) {
        # ajusta las necesidades jerárquicas
        $tax['hierarchical'] = true;
        $tax['rewrite']['hierarchical'] = true;

        # ajusta las mejoras jerárquicas (estas podrían ignorarse)
        $tax['labels']['parent_item'] = sprintf(__("Parent %s"),
            $tax->labels->singular_name);
        $tax['labels']['parent_item_colon'] = sprintf(__("Parent %s:"),
            $tax->labels->singular_name);

        # convierte capacidades a array como lo espera register_taxonomy
        $tax['capabilities'] = (array)$tax['cap'];
        # convierte etiquetas a array
        $tax['labels'] = (array)$tax['labels'];
        # registra la taxonomía con nuestras nuevas configuraciones
        register_taxonomy($tax_name, array('post'), $tax);
    }
}
# acción init con una prioridad tardía para que otras taxonomías se carguen
# alternativamente podría hacerse con el hook de acción `registered_taxonomy`
add_action('init', 'reregister_taxonomy', 9999);

Solo después de escribir esto me di cuenta de que esta pregunta tenía un año y medio de antigüedad, quizás alguien lo encuentre útil de todos modos.

9 nov 2012 00:50:42
0

Para que los enlaces permanentes jerárquicos funcionen, necesitas agregar reglas de reescritura. He logrado armar un código que hace que un tipo de entrada personalizado con una taxonomía personalizada funcione con términos padre/hijo reflejados en los enlaces permanentes. ¡No es perfecto, pero funciona!

function keha_add_rewrite_rules() {
        // Regla para estructura jerárquica: posttype_slug/taxonomia_padre/taxonomia_hija/entrada
        add_rewrite_rule( '^posttype_slug/(.+?)/(.+?)/(.+?)$', 'index.php?taxonomy=$matches[1]&taxonomy=$matches[2]&posttype=$matches[3]', 'top' );
        // Regla para estructura: posttype_slug/taxonomia/entrada/
        add_rewrite_rule( '^posttype_slug/(.+?)/(.+?)/$', 'index.php?posttype=$matches[2]', 'top' );
        // Regla alternativa para estructura jerárquica
        add_rewrite_rule( '^posttype_slug/(.+?)/(.+?)/(.+?)$', 'index.php?posttype=$matches[3]', 'top' );
        // Regla para taxonomías: posttype_slug/taxonomia/
        add_rewrite_rule( '^posttype_slug/(.+?)/(.+?)/?$', 'index.php?taxonomy=$matches[2]', 'top' );
        // Regla básica para taxonomía individual
        add_rewrite_rule( '^posttype_slug/(.+?)$', 'index.php?taxonomy=$matches[1]', 'top' );
}
// Ejecutar la función durante la inicialización de WordPress
add_action('init', 'keha_add_rewrite_rules');

Puedes ver mi ejemplo funcional en Github:

https://github.com/keha76/WordPress-CPT-Hierarchical-Taxonomy-Permalinks

22 sept 2013 20:49:26
2

Gracias a @anubhava

Un pequeño estudio sobre la API de Rewrite de WP encontró la solución.

1) He creado una URL de rewrite personalizada y la he colocado en mi archivo functions.php

function services_rewrite_basic() {
  add_rewrite_rule('^services/.*', 'index.php?page_id=110&level=$matches[1]&level=$matches[1]&level=$matches[1]', 'top');
}
add_action('init', 'services_rewrite_basic');

2) Y finalmente solo guardé la página de enlaces permanentes sin ningún cambio y eso hizo el truco.

20 sept 2016 18:37:59
Comentarios

Podría estar equivocado, pero creo que esto no tiene en cuenta las traducciones, ¿verdad? Excepto que el slug del impuesto sea "services" en todos los idiomas...

wbq wbq
28 nov 2019 18:19:24

services es el nombre de la página (nombre del archivo, por ejemplo services_page.php)

Fury Fury
29 nov 2019 13:39:11