domingo, 15 de septiembre de 2013

Wordpress mostrar custom post types usando querys

Si hemos creado tipos de post, seguramente necesitemos mostrar en una página solo esos post. Primero que nada debemos crear un archivo en la raíz de nuestro theme que se llame "singe-(nombre del custom type).php". Ejemplo: Si nuestro custom post type se llama "noticias" el archivo en donde se verá el post de la noticias se llamará "single-noticias.php".

El siguiente paso es dentro de la página poner el código necesario para mostrar el post, aquí un ejemplo básico:

<?php
/*
Template Name: Single Noticia
*/
?>
<?php get_header(); ?>

        <div class="content">
            
                <?
                if ( have_posts() ) : while ( have_posts() ) : the_post();
                $type = get_post_type( get_the_ID() );
                if($type == "noticia"){
                ?>

                <?php the_title(); //show post title?>

                    <?
                    the_content();                    
                    ?>
                
                <?    
                }
                endwhile;
                endif;    
                ?>
                        
        </div>
        
        <?php get_footer(); ?>
    
</body>

</html>

Como pueden ver de ésta manera cuando vemos un custom post type "noticia" nos llevará a este template que hemos creado. Pero ésta página solo muestra el single. Para mostrar todas las "noticias" debemos crear una pagina dentro del admin de wordpress, crear un archivo que se llame por ejemplo "noticias.php" y añadirle el template a la página.


Aquí pueden observar que seleccionamos el template que deseamos para una página en particular.

Nota: "La página que desplegará nuestros custom post types se crea en la opción 'Pages' del administrador de Wordpress"




















Ahora que ya sabemos el procedimiento en el administrador, veamos el código necesario que vamos a colocar en noticias.php para poder desplegar todos los post que estén bajo el tipo de post "noticia".

<?php
/*
Template Name: Noticias
*/
?>
<?php get_header(); ?>

                    <?php 
                      global $wp_query;
                      $temp = $wp_query; 
                      $wp_query = null; 
                      $wp_query = new WP_Query(); 
                      $wp_query->query('showposts=10&post_type=noticia'.'&paged='.$paged);  
                      if ( $wp_query->have_posts() ) : while ($wp_query->have_posts()) : $wp_query->the_post();
                    ?>                                                
                                <? the_title();?>
                                
                                <?php the_content();?>
                    
                    <?
                        endwhile;
                        endif;
                    ?>    
        
        <?php get_footer(); ?>
    
</body>

</html>

Como podemos ver la única diferencia con el loop anterior es que vamos a desplegar 10 post del tipo noticia y paginado. Esto lo hacemos con las wp_querys que nos permiten hacer las consultas que nosotros queremos fuera del clásico loop que nos trae todos los post.

Aquí es donde se cocina esto:

$wp_query = new WP_Query(); 
$wp_query->query('showposts=10&post_type=noticia'.'&paged='.$paged);

1 comentario:

  1. Gracias por el post! pero tengo un problema mucho mayor con los post ya creados y sus usuarios. El tema es que me gustaría asociar esos custom post type "noticias" en este caso, "ofertas" en el mio, con el post en cuestion. Es decir, poder mostrar un icono en el post (index.php) si el usuario tiene oferta y si no que no muestre nada, y en el single del mismo post poder mostrar la información de esa oferta. No se si es posible o me he vuelto loco.

    ResponderEliminar