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

28

Básicamente, quiero lograr un glosario utilizando tipos de publicaciones personalizados y tengo algunos problemas para configurar la reescritura como 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/

En realidad logré esto usando el siguiente código, pero estoy seguro de que es una forma muy extraña de hacerlo y sé que está funcionando mal en algún lugar, ya que se llaman las plantillas incorrectas al ver las páginas. Excepto por enlace , 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.php en 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');
    
pregunta maryisdead 25.06.2011 - 17:03

2 respuestas

28

Siempre puede anular la plantilla que se llamará con template_include 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/ debería ser una página de archivo para todas las publicaciones de sumo-glossary-term
  • /glossary/[letter]/ debe ser una página de archivo para publicaciones con el término de taxonomía [letter] en la taxonomía de sumo-glossary-letter
  • /glossary/[letter]/[term-name]/ debe ser una publicación individual sumo-glossary-term

Esto significa que la primera cargará la plantilla archive-sumo-glossary-term.php , la segunda cargará taxonomy-sumo-glossary-letter.php y la tercera cargará single-sumo-glossary-term.php .

Logré esto en WordPress 3.2 al establecer explícitamente la barra de reescritura de taxonomía, y tanto la barra de reescritura como la barra de archivo para el tipo de publicación, y ninguna otra regla de reescritura. Además, primero registré la taxonomía y el tipo de publicación posterior, para asegurarme de que las prioridades eran correctas (de lo contrario, una URL como /glossary/f/page/2 va al término del glosario page en lugar de la página 2 de la letra 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;
}
    
respondido por el Jan Fabry 09.07.2011 - 14:43
0

No lo he usado personalmente, pero lo que deberías mirar es "add_rewrite_rule"

enlace

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

    
respondido por el eeMZee 29.06.2011 - 20:57

Lea otras preguntas en las etiquetas