Obtener solo get_posts de formatos de publicación específicos en WordPress
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>
<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.

No puedes realmente pasar un argumento relacionado con taxonomías a (Edición: en realidad, sí puedes. El Codex no es del todo claro. Mirando el código fuente, get_posts()
.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>
<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>
<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();

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.

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

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.

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}
.

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'
)
)
);

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

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..
