Obtener solo get_posts de formatos de publicación específicos en WordPress

13 abr 2012, 14:34:00
Vistas: 17.1K
Votos: 11

Estoy intentando crear un listado de archivo que solo muestre mis artículos con formato "estándar" (no formatos como enlace, aside, cita, etc.).

¿Cómo podría implementar has_post_format( 'standard' ), o algo similar, en el siguiente código?

No he podido encontrar una consulta para get_posts que solo solicite tipos de formato específicos.

<?php    
    // Obtener los posts
    $myposts = get_posts('numberposts=-1&orderby=post_date&order=DESC');     
?>

<?php foreach($myposts as $post) : ?>   

<?php    
    // Configurar las variables del post
    setup_postdata($post);

    $year = mysql2date('Y', $post->post_date);
    $month = mysql2date('n', $post->post_date);
    $day = mysql2date('j', $post->post_date);    
?>

<p>
    <span class="the_article">
        <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
    </span>
    &nbsp;&nbsp;&nbsp;
    <span class="the_day">
        <?php the_time('j F Y'); ?>
    </span>
</p>

<?php endforeach; ?>

Mis habilidades en PHP son de nivel principiante como mucho, así que cualquier ayuda sería muy apreciada.

0
Todas las respuestas a la pregunta 4
4
22

No puedes realmente pasar un argumento relacionado con taxonomías a get_posts(). (Edición: en realidad, sí puedes. El Codex no es del todo claro. Mirando el código fuente, get_posts() es, en esencia, solo un envoltorio para WP_Query().) Puedes pasar meta keys/values, y tipos de post, pero no taxonomías como el formato del post. Así que para esta línea:

$myposts = get_posts('numberposts=-1&orderby=post_date&order=DESC');

Recomendaría usar WP_Query() en lugar de get_posts():

$myposts = new WP_Query( array(
    'tax_query' => array(
        array(                
            'taxonomy' => 'post_format',
            'field' => 'slug',
            'terms' => array( 
                'post-format-aside',
                'post-format-audio',
                'post-format-chat',
                'post-format-gallery',
                'post-format-image',
                'post-format-link',
                'post-format-quote',
                'post-format-status',
                'post-format-video'
            ),
            'operator' => 'NOT IN'
        )
    )
) );

Nota: sí, son muchos arrays anidados. Las consultas de taxonomías pueden ser complicadas así.

El siguiente paso es modificar tus declaraciones de apertura/cierre del loop. Cambia estos:

<?php foreach($myposts as $post) : ?>

    <?php /* el marcado del loop va aquí */ ?>

<?php endforeach; ?>

...a esto:

<?php if ( $myposts->have_posts() ) : while ( $myposts->have_posts() ) : $myposts->the_post(); ?>

    <?php /* el marcado del loop va aquí */ ?>

<?php endwhile; endif; ?>

<?php wp_reset_postdata(); ?>

Tu marcado actual del loop debería poder permanecer igual, excepto que ya no necesitas llamar a setup_postdata( $post ):

<?php        
    $year = mysql2date('Y', $post->post_date);
    $month = mysql2date('n', $post->post_date);
    $day = mysql2date('j', $post->post_date);    
?>

<p>
    <span class="the_article">
        <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
    </span>
    &nbsp;&nbsp;&nbsp;
    <span class="the_day">
        <?php the_time('j F Y'); ?>
    </span>
</p>

Así que, uniendo todo:

<?php
// Solo consultar posts con el
// formato de post "estándar", lo cual
// requiere *excluir* todos los otros
// formatos de post, ya que ni la
// taxonomía "post_format" ni el término
// de taxonomía "post-format-standard"
// se aplican a posts sin
// formatos definidos
$myposts = new WP_Query( array(
    'tax_query' => array(
        array(                
            'taxonomy' => 'post_format',
            'field' => 'slug',
            'terms' => array( 
                'post-format-aside',
                'post-format-audio',
                'post-format-chat',
                'post-format-gallery',
                'post-format-image',
                'post-format-link',
                'post-format-quote',
                'post-format-status',
                'post-format-video'
            ),
            'operator' => 'NOT IN'
        )
    )
) );

// Abrir el loop
if ( $myposts->have_posts() ) : while ( $myposts->have_posts() ) : $myposts->the_post(); ?>

    $year = mysql2date('Y', $post->post_date);
    $month = mysql2date('n', $post->post_date);
    $day = mysql2date('j', $post->post_date);    
    ?>

    <p>
        <span class="the_article">
            <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
        </span>
        &nbsp;&nbsp;&nbsp;
        <span class="the_day">
            <?php the_time('j F Y'); ?>
        </span>
    </p>  
    <?php 

// Cerrar el loop
endwhile; endif;

// Restablecer los datos de $post a la consulta por defecto
wp_reset_postdata();
13 abr 2012 16:14:24
Comentarios

gracias, lo hiciste realmente fácil de entender para un principiante al desglosarlo muy bien. Supongo que como solo uso aside, link y formatos de publicación estándar, en realidad puedo omitir el resto.

daba daba
14 abr 2012 00:37:46

Sí; solo necesitarías incluir aquellos formatos de publicación para los que hayas habilitado soporte.

Chip Bennett Chip Bennett
14 abr 2012 00:43:06

get_posts() en realidad utiliza WP_Query, así que por supuesto que puedes pasar consultas de taxonomía, solo pásalas como un array y no como una cadena de consulta.

shabushabu shabushabu
14 abr 2012 13:45:48

@shabushabu gracias por eso. He actualizado mi respuesta.

Chip Bennett Chip Bennett
14 abr 2012 18:00:51
1

Los formatos de entrada son simplemente términos predefinidos en una taxonomía llamada post_format, por lo que deberías poder usar la jerarquía de plantillas de WordPress para crear archivos de formatos de entrada. Solo crea un archivo llamado taxonomy-post_format-post-format-standard.php en la raíz de tu tema y ese archivo se usará para mostrar todas tus entradas estándar. Puedes reemplazar 'standard' con cualquiera de los otros nombres de formato, como aside, link o video, por ejemplo taxonomy-post_format-post-format-video.php. Esto también funciona para cualquier otra taxonomía, siempre y cuando sigas este formato: taxonomy-{TAXONOMY_NAME}-{TERM_NAME}.php

Si deseas mostrar formatos de entrada con un bucle personalizado, por ejemplo en tu barra lateral o dentro de una plantilla de página, entonces puedes usar la consulta de taxonomía de @kaiser. Solo sustituye la taxonomía con post_format y los slugs con post-format-{FORMAT_NAME}.

13 abr 2012 15:34:58
Comentarios

gracias, pero estoy intentando crear los archivos dentro de una plantilla de página, así que optaré por alguna de las otras soluciones :)

daba daba
14 abr 2012 00:35:48
0

Para dos taxonomías diferentes. Para una sola, puedes omitir el argumento relation.

$args = array(
    'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'movie_janner',
            'field' => 'slug',
            'terms' => array( 'action', 'commedy' ) // Términos individuales como string - múltiples como array
        ),
        array(
            'taxonomy' => 'actor',
            'field' => 'id',
            'terms' => array( 103, 115, 206 ),
            'operator' => 'NOT IN'
        )
    )
);
13 abr 2012 15:02:00
1
-1

Puedes hacer un truco como este:

<?php 
while( have_posts() ) : the_post();
get_post_format()==false? get_template_part( 'loop', 'posts' ) : false;
endwhile;
?>

Esto funciona porque get_post_format() para el formato de post estándar retorna false. http://codex.wordpress.org/Function_Reference/get_post_format

3 ene 2014 14:15:16
Comentarios

en realidad esto funciona, pero tendrás problemas al considerar la paginación. si haces algo como 'posts_per_page' => 6 y tienes 4 publicaciones con plantillas NO estándar, solo verás 2 publicaciones, no las 6 que deberían ser visibles. filtrar la consulta es la forma correcta de proceder..

honk31 honk31
20 jul 2015 22:16:40