Enlaces permanentes: tipo de publicación personalizada -> taxonomía personalizada -> publicación

39

Tengo problemas para trabajar con las reglas de reescritura de WordPress, y podría necesitar algo de ayuda.

Tengo un tipo de mensaje personalizado llamado _shows_.

Todos los programas tienen una única categoría de taxonomía personalizada _show-category_.A _show_nunca tendrá más de uno _show-category_.

Me gustaría que mis URL se encaminen de esta manera:

www.mysite.com/shows/  =>  archive-shows.php

www.mysite.com/shows/%category%/ => taxonomy-show-category.php

www.mysite.com/shows/%category%/%postname%/ => single-shows.php

Entonces, como ejemplo del mundo real, digamos que tenemos un _show-category_"Foo" y una _show_publicación titulada "Bar" que tiene "Foo" como es _show-category_. Esperaría que mi aplicación de WordPress se vea así:

www.mysite.com/shows/foo/ => shows all posts under the foo category
www.mysite.com/shows/foo/bar => shows the indivual post

Intento evitar complementos cuando sea posible, pero estoy abierto a cualquier solución.

Paul T
fuente
1
solo señalándote algo que tenía que hacer antes ... wordpress.stackexchange.com/questions/102246/…
reikyoushin

Respuestas:

70

Primero, registre su taxonomía y establezca el slugargumento de rewritea shows:

register_taxonomy(
    'show_category',
    'show',
    array(
        'rewrite' => array( 'slug' => 'shows', 'with_front' => false ),
        // your other args...
    )
);

A continuación, registre su tipo de publicación y establezca el slug en shows/%show_category%, y establezca el has_archiveargumento en shows:

register_post_type(
    'show',
    array(
        'rewrite' => array( 'slug' => 'shows/%show_category%', 'with_front' => false ),
        'has_archive' => 'shows',
        // your other args...
    )
);

Por último, agregue un filtro para post_type_linksustituir la categoría de espectáculo en enlaces permanentes de espectáculos individuales:

function wpa_show_permalinks( $post_link, $post ){
    if ( is_object( $post ) && $post->post_type == 'show' ){
        $terms = wp_get_object_terms( $post->ID, 'show_category' );
        if( $terms ){
            return str_replace( '%show_category%' , $terms[0]->slug , $post_link );
        }
    }
    return $post_link;
}
add_filter( 'post_type_link', 'wpa_show_permalinks', 1, 2 );

EDITAR

Olvidé el has_archiveargumento de register_post_typearriba, eso debería establecerse en shows.

Milo
fuente
1
Milo, gracias! El filtro post_type_link fue la pieza que faltaba para mí. Cualquiera que lea este hilo con el mismo problema, lo único que se debe tener en cuenta es que hay un pequeño error en la función wpa_show_permalinks, donde $ post-> post_type == 'show' en realidad debería ser 'shows'. Gracias de nuevo Milo!
Paul T
44
Si está haciendo un cambio en una instancia de WordPress existente, asegúrese de ir a Configuración> Enlaces permanentes y haga clic en guardar. Los cambios que ha realizado en functions.php no tendrán efecto hasta que lo haga.
Jay Neely
2
Esto casi funcionó para mí, ya que la taxonomía se muestra en la página de tipo de publicación, / post_type / taxonomy / es una página legítima (anteriormente 404) pero mi / post_type / taxonomy / post es 404'ing. Noté que al registrar la taxonomía arriba de "show_category", "show" se estaban registrando, aunque solo show_category es la taxonomía. Solo estoy registrando la taxonomía.
justinavery
44
@Milo, ¿alguna forma de hacer que esto funcione con sub-impuestos como shows / tax / subtax / post?
Benn
2
Deseé que esto también funcionara para mí, pero cada singular termina en un 404 ...
Beee