Soporte » WordPress Avanzado » Custom Taxonomy/Post Type URL

  • Resuelto inigonz

    (@inigonz)


    Buenos días a tod@s,

    Tengo una duda con las urls de los custom taxonomies / post types que creo.
    He creado una taxonomía llamada ‘categoría de proyectos’, y un post type ‘proyecto’. He añadido una categoría, cat1 y un proyecto, proy1, como hago para que la url del proyecto ponga la categoría? es decir, entro en la cat1 y la url seria: http://www.miweb.com/cat1 y cuando entre en el proy1, debería ser http://www.miweb.com/cat1/proy1.

    En la creación de la taxonomía, he puesto ‘rewrite’=> array(‘slug’=> ‘proyectos’) y en el post type ‘rewrite’ => array(‘slug’ => ‘Proyectos/%categoria_proyectos%’), pero no es lo mismo, ya que está con mayúscula. Hay alguna forma de que salga bien?

    Muchas gracias por la ayuda

    • Este debate fue modificado hace 3 años, 7 meses por inigonz.
Viendo 9 respuestas - de la 16 a la 24 (de un total de 24)
  • en mi plantilla taxonomy-proyecto-category.php:

    <?php
    	get_header();
    
    	if ( qtrans_getLanguage() == 'en' ) {
            $idioma = 'en';
        } else {
            $idioma = 'es';
        }
    
    	global $wp_query;
        $taxonomy           		= $wp_query->queried_object;
        $taxonomy->children 		= get_terms( 'proyecto-category', array( 'hide_empty' => 0, 'parent' => $taxonomy->term_id, 'orderby' => 'id', 'order' => 'ASC', ) );
        $parent             		= $taxonomy->parent;
        $not_the_last_subcategory 	= is_array( $taxonomy->children ) && count( $taxonomy->children ) && $taxonomy->parent == 0;
    ?>
        <section>
            <div class="pr_content">
    <?php 
                if ( $parent ) { // Ficha Subcategoria
    
                } else {  // Ficha Categoria
    
                }
    
                if ( $not_the_last_subcategory ) { // MOSTRAR LAS SUBCATEGORIAS
                	$columnas = count($taxonomy->children);
    ?>
    				<div class="p_fondo"><span style="background-image: url('../uploads/2016/04/DKIST-ADA-Home-.jpg')"></span></div>
                    <div class="pr_linea"></div>
                    <div class="pr_subcategorias <?php echo 'col' . $columnas; ?>">
    <?php
                        foreach ( $taxonomy->children as $key=>$subcategory ) {
    ?>
                            <div class="th_subcategoria">
                                <h2><a href="<?php echo get_term_link( $subcategory, 'proyecto-category' ) ?>"><?php echo $subcategory->name ?></a></h2>
                                <p class="th_subcategoria_description"><a href="<?php echo get_term_link( $subcategory, 'proyecto-category' ) ?>">
    <?php 
                                    $description = qtrans_use( $idioma, $subcategory->description, false );
                                    echo $description;
    ?>
                                </a></p>
                                <p class="th_subcategoria_gotoprojects"><a href="<?php echo get_term_link( $subcategory, 'proyecto-category' ) ?>"><?php if ( $idioma == 'es' ) { echo 'VER PROYECTOS'; } else { echo 'GO TO PROJECTS'; } ?></a></p>
                            </div>
    <?php
                        }
    ?>
                    </div>
    <?php
                } else { // MOSTRAR LOS PROYECTOS DE LAS SUBCATEGORIAS
                	$taxonomy->children = get_terms( 'proyecto-category', array('hide_empty' => 0, 'parent' => $parent, 'orderby' => 'id', 'order' => 'ASC', ));
                	$columnas  			= count($taxonomy->children);
                	$current_category 	= get_query_var('proyecto-category');
    ?>
    				<div class="pr_subcategorias_menu <?php echo 'col' . $columnas; ?>">
    <?php
                        $term = get_term( $parent, 'proyecto-category' );
    ?>
                        <h1><span><?php echo $term->name; ?></span><span class="rotate1" id="down-icon"></span></h1>
    					<ul>
    <?php
                        	foreach ( $taxonomy->children as $key=>$subcategory ) {
    ?>
    							<li class="th_subcategoria <?php if ( $subcategory->slug == $current_category ) echo 'activo'; ?>"><a href="<?php echo get_term_link( $subcategory, 'proyecto-category' ) ?>"><?php echo $subcategory->name ?></a></li>
    <?php
                        	}
    ?>
    						<li class="clear"></li>
    					</ul>
    				</div>
    				<div class="pr_mosaico">
    <?php 
    					$loop = new WP_Query( 
                            array(
                                'proyecto-category' => $current_category,
                                'post_type'         => 'proyecto',
                                'posts_per_page'    => -1,
                                'orderby'           => 'menu_order',
                                'order'             => 'ASC',
                                'no_found_rows'     => true // Si no hay paginacion, hace mas rapido la QUERY
                            )
                        );
    
                        if ( $loop->have_posts() ) {
                            while ( $loop->have_posts() ) {
                                $loop->the_post();
    
                                $pr_id      = get_the_id();
                                $pr_image   = wp_get_attachment_url( get_post_thumbnail_id( $pr_id ) );
    ?>
                                <div class="th_proyecto">
                                    <img src="<?php echo aq_resize( $pr_image, 425, 217, false ); ?>" alt="<?php the_title(); ?>" />
                                    <h2><a href="<?php the_permalink(); ?>"><span><?php the_title(); ?></span></a></h2>
                                </div>
    <?php
                            }
                        }
    ?>
    				</div>
    <?php
                }
    ?>
    		</div>
        </section>
    <?php
    	get_footer();
    ?>

    Y en el single-proyecto.php:

    <?php
    	get_header();
    
    	if ( qtrans_getLanguage() == 'en' ) {
    		$idioma = 'en';
    	} else {
    		$idioma = 'es';
    	}
    ?>
    	<section>
    		<div class="pr_content">
    <?php
    			$post_id 			= get_the_id();
    			$term 	 			= wp_get_object_terms( $post_id, 'proyecto-category' );
    			$current_category 	= $term[0]->slug;
    			$current_father 	= $term[0]->parent;
    			$taxonomy->children = get_terms( 'proyecto-category', array( 'hide_empty' => 0, 'parent' => $current_father, 'orderby' => 'id', 'order' => 'ASC', ));
    			$columnas			= count($taxonomy->children);
    ?>
    			<div class="pr_subcategorias_menu <?php echo 'col' . $columnas; ?>">
    				<ul>
    <?php
    					foreach ( $taxonomy->children as $key=>$subcategory ) {
    ?>
    						<li class="th_subcategoria <?php if ( $subcategory->slug == $current_category ) echo 'activo'; ?>"><a href="<?php echo get_term_link( $subcategory, 'proyecto-category' ) ?>"><?php echo $subcategory->name ?></a></li>
    <?php
    					}
    ?>
    					<li class="clear"></li>
    				</ul>
    			</div>
    			<div class="pr_proyecto">
    <?php
    				if ( have_posts() ) {
    					while ( have_posts() ) {
    						the_post();
    
    						include ( get_template_directory() . '/php/slide.php' );
    ?>
    						<h1><?php the_title(); ?></h1>
    						<div class="pr_contenido">
    							<div>
    								<div class="izq">
    									<?php $client = 'Cliente'; ?>
    									<?php if ( $client ) { ?> <p><span>CLIENTE:</span> </p> <?php } ?>
    									<?php if ( $services ) { ?> <p><span>SERVICIOS:</span> </p> <?php } ?>
    									<?php if ( $year ) { ?> <p><span>AÑO:</span> </p> <?php } ?>
    									<?php if ( $country ) { ?> <p><span>PAIS:</span> </p> <?php } ?>
    								</div>
    								<div class="dcha <?php if ( !$client && !$services && !$year && !$country ) echo 'full'; ?>">
    									<?php the_excerpt(); ?>
    								</div>
    								<div class="clear"></div>
    							</div>
    <?php
    							if ( get_the_content() || $pdf || $relaciones || $premios || $videos ) {
    ?>
    								<div class="pr_mas_botones">
    									<ul>
    										<li class="btn_icono"></li>
    										<?php if ( get_the_content() ) { ?> <li class="btn_mas">INFO</li> <?php } ?>
    										<?php if ( $relaciones ) { ?> <li class="btn_relaciones">PROYECTOS RELACIONADOS</li> <?php } ?>
    										<?php if ( $premios ) { ?> <li class="btn_premios">PREMIOS</li> <?php } ?>
    										<?php if ( $videos ) { ?> <li class="btn_videos">VIDEOS</li> <?php } ?>
    									</ul>
    								</div>
    								<div class="pr_mas_contenido">
    <?php
    									if ( get_the_content() ) echo '<div class="cnt_mas">' . get_the_content() . '</div>';
    									if ( $relaciones ) 		 echo '<div class="cnt_relaciones">' . $relaciones . '</div>';
    									if ( $premios ) 		 echo '<div class="cnt_premios">' . $premios . '</div>';
    									if ( $videos )  		 echo '<div class="cnt_videos">' . $videos . '</div>';
    ?>
    								</div>
    <?php
    							}
    ?>
    						</div>
    <?php
    					}
    				}
    ?>
    			</div>
    <?php
    			$father = get_term_by( 'id', $current_father, 'proyecto-category' );
    ?>
    			<h3><?php echo $father->name . ' - ' . $current_category; ?></h3>
    			<div class="pr_mosaico">
    <?php 
    				$loop = new WP_Query( 
    					array(
    						'proyecto-category' => $current_category,
    						'post_type'        	=> 'proyecto',
    						'post__not_in'      => array( $post_id ),
    						'posts_per_page'    => -1,
    						'orderby'           => 'menu_order',
    						'order'             => 'ASC',
    						'no_found_rows'     => true // Si no hay paginacion, hace mas rapido la QUERY
    					)
    				);
    
    				if ( $loop->have_posts() ) {
    					while ( $loop->have_posts() ) {
    						$loop->the_post();
    
    						$pr_id      = get_the_id();
    						$pr_image   = wp_get_attachment_url( get_post_thumbnail_id( $pr_id ) );
    ?>
    						<div class="th_proyecto">
    							<img src="<?php echo aq_resize( $pr_image, 425, 217, false ); ?>" alt="<?php the_title(); ?>" />
    							<h2><a href="<?php the_permalink(); ?>"><span><?php the_title(); ?></span></a></h2>
    						</div>
    <?php
    					}
    				}
    ?>
    			</div>
    		</div>
    	</section>
    <?php
    	get_footer();
    ?>

    Si necesitas alguna pagina mas me dices, pero si, he reseteado permalinks, he probado con lo de flush dns y no me reconoce el single-proyecto y no se porque, las urls funcionan perfectamente

    Gracias

    Entonces el fallo que te da ahora es con el taxonomy-{taxonomy} y su single-{post-type} no?

    Me está costando un poco la verdad, al reescribir los permalinks parece que da conflicto con los templates aunque no encuentro una solución.

    Mi pregunta es, cada custom post type que has hecho, por ejemplo noticias, luego tendrá categorías padre e hijas? Es decir /noticias/catpadre/cathija/postname no?

    el taxonomy-{taxonomy} funciona bien, el que me falla es el single-{post-type} que me sale la pantalla vacía, si renombro el archivo y pongo solo single.php sale la ficha del proyecto bien, pero necesito que sea single-{post-type}.

    Proyectos es el único post type que tiene categorías, padres, hijas y algunas nietas, las demás solo tienen categorías, es decir, por ejemplo el dpto de energía tiene en «proyectos», la categoría energía, como hijos tiene termosolares, eólica, biomasa,.. y a su vez, termosolares tiene como hijos ciclos combinados, ciclos combinado simples,….
    en noticias solo tiene la categoría de energía, lo mismo pasará en publicaciones, no se si me explico.

    Me parece demasiado «rollo» hacer todo esto para poner unas urls que en la mayoría de las webs funcionan así, porque wp no lo hace por defecto?

    Muchas gracias por todo.

    Si yo pienso lo mismo, por eso te comentaba que igual para evitarte lo de reescribir los links, podrías probar otros métodos, por ejemplo (no lo he probado) en vez de categorías y subcategorías que era el inicio del problema, que haya páginas padre e hijas, o usar los tags. Por último tambien te queda la opción de usar algun plugin que te facilite crear más custom post types para cada cosa, hay algunos de muy buenos que alomejor te lo facilitan.

    Haré algunas pruebas y si saco algo más en claro te lo comento.

    Un saludo.

    oki, muchísimas gracias por tu ayuda, por tu tiempo, da gusto escribir en un foro y la gente sea tan maja, ayude tanto, y se implique de esta manera, muchísimas gracias.
    Si saco algo en claro, te comento

    Saludos

    Buenas Merksk8,

    Has podido mirar algo por la red o has conseguido resolverlo?
    yo sigo buscando pero no encuentro nada de na, tengo mas paginas vistas ….. y todas dan las mismas soluciones, que si el flush_rewrite_rules(), y cosas así, y a la gente le suele funcionar o eso ponen, pero a mi na de na, ya empiezo a pensar que tengo algo mal en mi código, no se

    Saludos

    Hola,
    he estado haciendo algunas pruebas pero no he sacado nada, ademas no tengo mucho tiempo estos días, a ver si alguien más te puede echar un cable.

    Pese a que puede que alguien te sepa decir la solución, un parche podría ser algo así:

    1. Creas una carpeta dentro del tema y la llamas ‘templates’.
    2. En el archivo ‘single.php’, en la parte que quieras editar, poner un switch:

    
    $pagina = get_post_type( get_the_ID() );
    
    switch($pagina):
      case "post-type-1":
        require_once( get_template_directory() . '/templates/post-type-1.php'
        break;
      case "post-type-2":
        require_once( get_template_directory() . '/templates/post-type-2.php'
        break;
      default: 
        break;

    Algo así, no está hecho 100% bien pero es para que te hagas una idea y organizarte las plantillas. Basicamente $pagina te da el tipo de post de la página, y el switch te carga una plantilla u otra. En el default pones la que seria por defecto si no coincide con las otras. No es la mejor solución pero te puede servir de apaño si no encuentras otra.

    Un saludo.

    Buenas,

    Tranquilo, no pasa na.
    Justo ayer vi una solución parecida a esta pero no me convenció mucho esto de utilizar templates, no me cogía los css o algo raro me pasaba.
    He encontrado una solución pero no esta del todo acabada, http://www.ibenic.com/custom-wordpress-rewrite-rule-combine-taxonomy-post-type/. Faltaría poner toda la ruta de categorías padre ya que solo pone la última, todo lo demás funciona bien, a ver si consigo maquearlo para que funcione a mi gusto

    Gracias

    Buenas,

    Al final he vuelto a seguir lo de los templates que me comentabas antes, porque con el código del link anterior no consigo na de na. He buscado un poco por internet y con este código funciona perfectamente,

    add_action( 'template_redirect', 'my_fancy_template_redirect' ); 
            function my_fancy_template_redirect(){
                global $wp_query;
             
                /* Check if we are querying proyecto-posts: */
                if ( $wp_query->query_vars['post_type'] == 'proyecto' ) {
                    /* Then check if we are dealing with a single proyecto post or just multiple proyecto posts: */
                    if ( is_single() ) {
                        locate_template( array( 'templates/proyecto-single.php', 'single.php', 'index.php' ), true );
                        die();
                    }
                }
            }
Viendo 9 respuestas - de la 16 a la 24 (de un total de 24)
  • El debate ‘Custom Taxonomy/Post Type URL’ está cerrado a nuevas respuestas.