Soporte » WordPress Avanzado » Mostrar custom post type con custom taxonomy term

  • Hola buenos días, les presento mi problema

    Tengo 3 custom post types creados que comparten 1 custom taxonomy que tiene 2 terminos.

    La cuestión es que quiero mostrar un custom post con un termino.

    Es decir, tengo por ejemplo, libros y peliculas como custom post type y como taxonomy tengo genero y como termino tengo accion y aventura. Lo que quiero es filtrar algo que quede como

    misitio.com/micustompost/mitaxonomy/mitermino que seria
    misitio.com/libros/genero/aventura

    En los archivos templates de wordpress existe taxonomy-{mi-taxonomy}-{mi-termino}.php pero no existe nada como taxonomy-{mi-post-type}-{mi-taxonomy}-{mi-termino}.php
    ni tampoco existe algo como archive-{mi-post-type}-{mi-taxonomy}-{mi-termino}.php

    Template Hierarchy

    he visto que varios se han encontrado con esta limitación y lo han podido resolver:
    https://wordpress.org/support/topic/cunstom-taxonomy-archives-with-custom-post-types/?replies=2#post-5089218

    WordPress Custom Taxonomy Archive for Custom Post Types

    Pero el tema es que su solución se puede aplicar si tenes un taxonomy con un custom post, en mi caso tengo 3 custom post que comparte una custom taxonomy.

    lo que he visto que es lo que estoy investigando ahora es que el termino se puede filtrar en la url.
    misitio.com/genero/aventura?post_type=libros y toma de template el archive-libros.php

    Alguna ayuda de como resolver este problema? se entiende lo que quiero decir?

Viendo 1 respuesta (de un total de 1)
  • Buenas,

    Yo tengo algo parecido a lo tuyo, pero sin utilizar el nombre de la taxonomía en la url, es decir, yo tengo http://www.prueba.com/posttype/term/termhijo/ pero entiendo que solo tendrías que añadir a la url a mano tu taxonomía.

    Utilizo reglas para redireccionar:

    // Rewrites rules Noticias
           	add_action( 'generate_rewrite_rules', 'register_PostType_rewrite_rules' );
            function register_PostType_rewrite_rules( $wp_rewrite ) {
                $new_rules = array( 
                    PostType_lang_rewrite('proyecto') . '/([^/]+)/?$' => 'index.php?departamento=' . $wp_rewrite->preg_index( 1 ),
                    PostType_lang_rewrite('proyecto') . '/([^/]+)/([^/]+)/?$' => 'index.php?post_type=proyecto&departamento=' . $wp_rewrite->preg_index( 1 ) . '&proyecto=' . $wp_rewrite->preg_index( 2 ),
                    PostType_lang_rewrite('proyecto') . '/([^/]+)/([^/]+)/page/(\d{1,})/?$' => 'index.php?post_type=proyecto&departamento=' . $wp_rewrite->preg_index( 1 ) . '&paged=' . $wp_rewrite->preg_index( 3 ),
                    PostType_lang_rewrite('proyecto') . '/([^/]+)/([^/]+)/([^/]+)/?$' => 'index.php?post_type=proyecto&departamento=' . $wp_rewrite->preg_index( 2 ) . '&proyecto=' . $wp_rewrite->preg_index( 3 ),
                    PostType_lang_rewrite('proyecto') . '/([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$' => 'index.php?post_type=proyecto&departamento=' . $wp_rewrite->preg_index( 3 ) . '&proyecto=' . $wp_rewrite->preg_index( 4 ),
    
                    PostType_lang_rewrite('noticia') . '/([^/]+)/?$' => 'index.php?departamento=' . $wp_rewrite->preg_index( 1 ),
                    PostType_lang_rewrite('noticia') . '/([^/]+)/([^/]+)/?$' => 'index.php?post_type=noticia&departamento=' . $wp_rewrite->preg_index( 1 ) . '&noticia=' . $wp_rewrite->preg_index( 2 ),
                    PostType_lang_rewrite('noticia') . '/([^/]+)/([^/]+)/page/(\d{1,})/?$' => 'index.php?post_type=noticia&departamento=' . $wp_rewrite->preg_index( 1 ) . '&paged=' . $wp_rewrite->preg_index( 3 ),
                    PostType_lang_rewrite('noticia') . '/([^/]+)/([^/]+)/([^/]+)/?$' => 'index.php?post_type=noticia&departamento=' . $wp_rewrite->preg_index( 2 ) . '&noticia=' . $wp_rewrite->preg_index( 3 ),
                    PostType_lang_rewrite('noticia') . '/([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$' => 'index.php?post_type=noticia&departamento=' . $wp_rewrite->preg_index( 3 ) . '&noticia=' . $wp_rewrite->preg_index( 4 ),
                );
    
                $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
            }
    
            // A hacky way of adding support for flexible custom permalinks
            // There is one case in which the rewrite rules from register_kb_rewrite_rules() fail:
            // When you visit the archive page for a child section(for example: http://example.com/noticia/category/child-category)
            // The deal is that in this situation, the URL is parsed as a Knowledgebase post with slug "child-category" from the "category" section
            function fix_PostType_subcategory_query($query) {
            	$postTypes = array( 'proyecto', 'noticia' );
    
            	foreach ( $postTypes as $postType ) {
    	            if ( isset( $query['post_type'] ) && $postType == $query['post_type'] ) {
    	                if ( isset( $query[$postType] ) && $query[$postType] && isset( $query['departamento'] ) && $query['departamento'] ) {
    	                    $query_old = $query;
    	                    // Check if this is a paginated result(like search results)
    	                    if ( 'page' == $query['departamento'] ) {
    	                        $query['paged'] = $query['name'];
    	                        unset( $query['departamento'], $query['name'], $query[$postType] );
    	                    }
    	                    // Make it easier on the DB
    	                    //$query['fields'] = 'ids';
    	                    $query['posts_per_page'] = 1;
    
    	                    // See if we have results or not
    	                    $_query = new WP_Query( $query );
    	                    if ( ! $_query->posts ) {
    	                        $query = array( 'departamento' => $query[$postType] );
    	                        if ( isset( $query_old['departamento'] ) && 'page' == $query_old['departamento'] ) {
    	                            $query['paged'] = $query_old['name'];
    	                        }
    	                    }
    	                }
    	            }
    	        }
    
                return $query;
            }
            add_filter( 'request', 'fix_PostType_subcategory_query', 10 );
    
            function PostType_article_permalink( $article_id, $section_id = false, $leavename = false, $only_permalink = false ) {
                $taxonomy   = 'departamento';
                $article    = get_post( $article_id );
    
                $return     = '<a href="';
                $permalink  = ( $section_id ) ? trailingslashit( get_term_link( intval( $section_id ), 'departamento' ) ) : home_url( '/' . PostType_lang_rewrite(get_post_type()) . '/' );
                $permalink .= trailingslashit( ( $leavename ? "%$article->post_type%" : $article->post_name ) );
                $return    .= $permalink . '/" >' . get_the_title( $article->ID ) . '</a>';
                return ( $only_permalink ) ? $permalink : $return;
            }
    
            function filter_PostType_post_link( $permalink, $post, $leavename ) {
                if ( get_post_type( $post->ID ) == 'proyecto' || get_post_type( $post->ID ) == 'noticia' ) {
                    $terms      = wp_get_post_terms( $post->ID, 'departamento' );
                    $term       = ( $terms ) ? $terms[0]->term_id : false;
                    $permalink  = PostType_article_permalink( $post->ID, $term, $leavename, true );
                }
                return $permalink;
            }
            add_filter( 'post_type_link', 'filter_PostType_post_link', 100, 3 );
    
            function filter_PostType_section_terms_link( $termlink, $term, $taxonomy = false ) {
                if ( $taxonomy == 'departamento' ) {
                    $section_ancestors = get_ancestors( $term->term_id, $taxonomy );
                    krsort( $section_ancestors );
                    $termlink =  home_url( '/' . PostType_lang_rewrite(get_post_type()) . '/' );
                    foreach ( $section_ancestors as $ancestor ) {
                        $section_ancestor = get_term( $ancestor, $taxonomy );
                        $termlink .= $section_ancestor->slug . '/';
                    }
                    $termlink .= trailingslashit( $term->slug );
                }
    
                return $termlink;
            }
            add_filter( 'term_link', 'filter_PostType_section_terms_link', 100, 3 );

    La funcion PostType_lang_rewrite() la utilizo para traducir proyecto/project y noticia/new porque es un multisite, pero tu no tendrías que utilizar.

    El único pequeño problema que tengo, es que aunque la url tenga prueba.com/proyecto/categoria1/categoria1.1 me dice que el post type es noticia, ya que no sabe con que post type lo coge, y para solucionarlo he echo un pequeño parche, compruebo en la url si tiene noticia o proyecto.
    No se si con eso te he dado alguna luz

    Saludos

Viendo 1 respuesta (de un total de 1)
  • El debate ‘Mostrar custom post type con custom taxonomy term’ está cerrado a nuevas respuestas.