Somente get_posts de determinados formatos de postagem

10

Estou tentando criar uma lista de arquivos apenas com meus artigos "normais" em formato de postagem (não formatos de link, aparte, cotação, etc).

Como eu implementaria has_post_format( 'standard' ), ou algo semelhante, no código abaixo?

Não consegui encontrar uma consulta get_postsque solicite apenas tipos de formato específicos.

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

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

<?php    
    // Setup the post variables
    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; ?>

Minhas habilidades de php estão no nível iniciante, na melhor das hipóteses, então qualquer ajuda seria muito apreciada.

daba
fonte

Respostas:

20

Você não pode realmente passar um argumento relacionado à taxonomia para get_posts(). (Edit: na verdade, sim, você pode. O Codex é um pouco incerto. Olhar para a fonte get_posts()é, no fundo, apenas um invólucro WP_Query().) Você pode passar meta chaves / valores e tipos de postagem , mas não taxonomias como post formato. Então, para esta linha:

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

Eu recomendaria usar em WP_Query()vez 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: sim, existem muitas matrizes aninhadas. As consultas fiscais podem ser complicadas assim.

O próximo passo é modificar as instruções de abertura / fechamento do loop. Altere estes:

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

    <?php /* loop markup goes here */ ?>

<?php endforeach; ?>

...para isso:

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

    <?php /* loop markup goes here */ ?>

<?php endwhile; endif; ?>

<?php wp_reset_postdata(); ?>

Sua marcação de loop real deve poder permanecer a mesma, exceto que você não precisa mais chamar 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>

Então, juntando tudo:

<?php
// Only query posts with the
// "standard" post format, which
// requires *excluding* all other
// post formats, since neither the
// "post_format" taxonomy nor the
// "post-format-standard" taxonomy term
// is applied to posts without
// defined post formats
$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'
        )
    )
) );

// Open the 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 

// Close the loop
endwhile; endif;

// Reset $post data to default query
wp_reset_postdata();
Chip Bennett
fonte
obrigado, você facilitou a compreensão de um iniciante, dividindo-o perfeitamente. Estou supondo que, como eu apenas uso de lado, link e formatos de postagem padrão, posso pular o resto.
Daba
11
Sim; você só precisará incluir os formatos de postagem para os quais você ativou o suporte.
Chip Bennett
get_posts () na verdade utiliza WP_Query, então é claro que você pode passar consultas de taxonomia, apenas passá-las como uma matriz e não como uma string de consulta.
shabushabu
@shabushabu obrigado por isso. Eu atualizei minha resposta.
Chip Bennett
2

Os formatos de postagem são apenas termos predefinidos em uma taxonomia chamada post_format, portanto, você deve poder usar a hierarquia de modelos do WP para criar arquivos de formato de postagem. Basta criar um arquivo chamado taxonomy-post_format-post-format-standard.phpna raiz do seu tema e esse arquivo será usado para gerar todas as suas postagens padrão. Você pode substituir 'padrão' por qualquer outro nome de formato, como aside, linkou video, por exemplo, por exemplo taxonomy-post_format-post-format-video.php. Isso funciona para qualquer outra taxonomia, btw, desde que você se atenha a este formato:taxonomy-{TAXONOMY_NAME}-{TERM_NAME}.php

Se você quiser mostrar os formatos de postagem com um loop personalizado, por exemplo, na barra lateral ou dentro de um modelo de página, use a consulta de impostos do @kaiser. Apenas substitua a taxonomia por post_formate as lesmas por post-format-{FORMAT_NAME}.

shabushabu
fonte
Obrigado, mas eu estou tentando criar os arquivos dentro de um modelo de página, então eu vou com uma das outras soluções :)
Daba
1

Para duas taxonomias diferentes. Para um único, você pode deixar o relationargumento de fora.

$args = array(
    'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'movie_janner',
            'field' => 'slug',
            'terms' => array( 'action', 'commedy' ) // Single terms as string - multiple as array
        ),
        array(
            'taxonomy' => 'actor',
            'field' => 'id',
            'terms' => array( 103, 115, 206 ),
            'operator' => 'NOT IN'
        )
    )
);
kaiser
fonte
0

Você pode fazer truques assim:

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

Isso ocorre porque get_post_format () para o formato de postagem padrão retorna false. http://codex.wordpress.org/Function_Reference/get_post_format

theogrost
fonte
na verdade, isso funciona, mas você terá problemas quando considerar a paginação. se você fizer algo como 'posts_per_page' => 6e tiver 4 postagens com o modelo NÃO padrão, verá apenas 2 postagens, não as 6 que devem estar visíveis. filtrar a consulta é a prova maneira de ir ..
honk31