¿Mezclar estructuras de reescritura de tipo de publicación personalizada y taxonomía?

30

Básicamente, quiero lograr un glosario usando tipos de publicaciones personalizadas y tengo algunos problemas para configurar las reescrituras de la forma en que quiero que sean. Lo quiero así:

La URL principal del glosario: http://example.com/glossary/

Términos del glosario que comienzan con la letra A : http://example.com/glossary/a/

La URL para un solo término del glosario: http://example.com/glossary/a/atomic/

Realmente logré esto usando el código a continuación, pero estoy seguro de que es una forma muy incómoda de hacerlo y sé que está funcionando mal en algún lugar, ya que se llaman las plantillas incorrectas al ver las páginas. A excepción de http://example.com/glossary/ , donde se llama a archive-sumo-glossary-term.php como se esperaba, los otros dos simplemente activan index.php en mi tema.

Aquí va ( functions.phpen el tema):

add_action('init', 'create_glossary');
function create_glossary()
{
    register_post_type
    (
        'sumo-glossary-term',
        array
        (
            'labels' => array
            (
                'name' => _x('Glossary Terms', 'post type general name'),
                'singular_name' => _x('Glossary Term', 'post type singular name')
                # And so on …
            ),
            'supports' => array('title', 'editor', 'thumbnail'),
            'public' => true,
            'rewrite' => array
            (
                'slug' => 'glossary',
                'with_front' => false

            ),
            'query_var' => 'glossary-term',
            'has_archive' => true
        )
    );

    register_taxonomy
    (
        'sumo-glossary-letter',
        'sumo-glossary-term',
        array
        (
            'hierarchical' => true,
            'labels' => array
            (
                'name' => _x('Letters', 'taxonomy general name'),
                'singular_name' => _x('Letter', 'taxonomy singular name')
                # And so one
            ),
            'show_ui' => true,
            'query_var' => 'glossary-letter',
            'rewrite' => false
        )
    );
}

add_filter('post_type_link', 'glossary_term_permalink', 10, 4);
function glossary_term_permalink($post_link, $post, $leavename, $sample)
{
    if ($post->post_type == 'sumo-glossary-term')
    {
        $permalink = str_replace('glossary/', 'glossary/' . $post->post_name[0] . '/', $post_link);
    }
    return $permalink;
}

add_rewrite_rule('^glossary/([^/]*)?$','index.php?glossary-letter=$matches[1]','top');
add_rewrite_rule('^glossary/([^/]*)/([^/]*)?$','index.php?glossary-term=$matches[2]','top');
maryisdead
fuente

Respuestas:

30

Siempre puede anular la plantilla que se llamará con el template_includefiltro o un filtro relacionado, pero esto puede ocultar problemas más profundos con los archivos personalizados.

Según tengo entendido, desea utilizar la siguiente estructura:

  • /glossary/debe ser una página de archivo para todas las sumo-glossary-termpublicaciones
  • /glossary/[letter]/debe ser una página de archivo para publicaciones con el término taxonomía [letter]en la sumo-glossary-lettertaxonomía
  • /glossary/[letter]/[term-name]/debe ser una sumo-glossary-termpublicación individual

Esto significa que el primero cargará la plantilla archive-sumo-glossary-term.php, el segundo se cargará taxonomy-sumo-glossary-letter.phpy el tercero se cargará single-sumo-glossary-term.php.

Logré esto en WordPress 3.2 estableciendo explícitamente la ficha de reescritura de taxonomía, y la ficha de reescritura y la ficha de archivo para el tipo de publicación, y ninguna otra regla de reescritura. Además, registré la taxonomía primero y el tipo de publicación después, para asegurarme de que las prioridades fueran correctas (de lo contrario, una URL como /glossary/f/page/2va al término del glosario en pagelugar de la página 2 de la carta del glosario f).

add_action('init', 'create_glossary');
function create_glossary()
{

    register_taxonomy
    (
        'sumo-glossary-letter',
        array(),
        array
        (
            'hierarchical' => true,
            'labels' => array
            (
                'name' => _x('Letters', 'taxonomy general name'),
                'singular_name' => _x('Letter', 'taxonomy singular name')
                # And so one
            ),
            'show_ui' => true,
            'query_var' => 'glossary-letter',
            'rewrite' => array(
                'slug' => 'glossary',
            ),
        )
    );

    register_post_type
    (
        'sumo-glossary-term',
        array
        (
            'labels' => array
            (
                'name' => _x('Glossary Terms', 'post type general name'),
                'singular_name' => _x('Glossary Term', 'post type singular name')
                # And so on …
            ),
            'supports' => array('title', 'editor', 'thumbnail'),
            'public' => true,
            'rewrite' => array
            (
                'slug' => 'glossary/%sumo-glossary-letter%',
                'with_front' => false

            ),
            'query_var' => 'glossary-term',
            'has_archive' => 'glossary',
            'taxonomies' => array( 'sumo-glossary-letter' ),
        )
    );
}

add_filter('post_type_link', 'glossary_term_permalink', 10, 4);
function glossary_term_permalink($post_link, $post, $leavename, $sample)
{
    if ( false !== strpos( $post_link, '%sumo-glossary-letter%' ) ) {
        $glossary_letter = get_the_terms( $post->ID, 'sumo-glossary-letter' );
        $post_link = str_replace( '%sumo-glossary-letter%', array_pop( $glossary_letter )->slug, $post_link );
    }
    return $post_link;
}
Jan Fabry
fuente
Lo intentaré mañana y veré si funciona y volveré aquí. ¡Gracias!
maryisdead
Ok, no exactamente para mañana ... ¡Funcionó, casi perfectamente! ¡Gracias! Lo que no funciona es /glossary/. Me da un 404 ( archive-sumo-glossary-term.phpestá configurado). ¿Algunas ideas? Debo decir que estoy atascado en WP 3.0.1 y tal vez sea un problema de versión. Tengo que probarlo de nuevo cuando pueda actualizar. De todos modos, en su mayor parte está funcionando y por ahora no necesariamente necesito /glossary/y simplemente redirijo a la letra A. ¡Gracias de nuevo!
maryisdead
Hola, @maryisdead, tuve exactamente el mismo problema y se me ocurrió la misma solución, pero me quedé con el mismo problema: ¿cómo obtienes / glosario para ir a la plantilla archive-glossery.php? Acabo de encontrar la respuesta: use 'has_archive' => 'glossary', en lugar de has_archive => true notar que Jan lo tiene así en su respuesta, pero no lo tiene así en su código original: ¿actualizó esa parte? Comenzó a funcionar para mí tan pronto como hice ese cambio
Jeff
Hola Jeff! Sí, actualicé esa parte. Acabo de comprobar de nuevo, todavía no funciona. La instalación de WordPress en cuestión aún no está actualizada (3.0.1), por lo que tal vez esa sea la raíz del problema.
maryisdead
El mismo problema aquí, usando WP 3.2.1. ¿Todavía no hay solución?
Richard B
0

No he usado esto personalmente, pero lo que querrás ver es "add_rewrite_rule"

http://codex.wordpress.org/Rewrite_API/add_rewrite_rule

Tampoco olvides guardar los enlaces permanentes una vez que los hayas cambiado.

eeMZee
fuente
En realidad lo uso add_rewrite_rule, solo desplazo mi código hacia abajo. :-) Funciona bien hasta ahora, es solo que se llama a las plantillas incorrectas con esta forma de hacerlo.
maryisdead