仅某些帖子格式的get_posts


10

我正在尝试仅使用“常规”帖子格式的文章(而不是链接,旁白,引号等格式)创建存档列表。

如何has_post_format( 'standard' )在下面的代码中实现或类似的方法?

我一直无法找到get_posts仅要求特定格式类型的查询。

<?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; ?>

我的php技能最多是初学者,因此任何帮助将不胜感激。

Answers:


20

您实际上无法将与分类法相关的参数传递给get_posts() (编辑:实际上,是的,您可以。该Codex尚不清楚。从源头上看,get_posts()它只是一个包装WP_Query()。)您可以传递元键/值和post 类型,但不能传递诸如post之类的分类法格式。所以对于这一行:

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

我建议使用WP_Query()而不是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'
        )
    )
) );

注意:是的,这是很多嵌套数组。税务查询可能很棘手。

下一步是修改循环的打开/关闭语句。更改这些:

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

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

<?php endforeach; ?>

...对此:

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

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

<?php endwhile; endif; ?>

<?php wp_reset_postdata(); ?>

您的实际循环标记应该能够保持不变,只是您不再需要调用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>

因此,将它们放在一起:

<?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();

谢谢,很好地分解了它,使初学者很容易理解。我在猜测,因为我只使用旁注,链接和标准帖子格式,所以我实际上可以跳过其余部分。
daba '04

1
是; 您只需要包括启用了支持的任何帖子格式即可。
Chip Bennett 2012年

get_posts()实际上利用了WP_Query,因此您当然可以传入分类查询,只是将它们作为数组而不是查询字符串进行传递。
shabushabu 2012年

@shabushabu谢谢你。我已经更新了答案。
Chip Bennett 2012年

2

发布格式只是分类法中称为的预定义术语post_format,因此您应该能够使用WP模板层次结构创建发布格式档案。只需taxonomy-post_format-post-format-standard.php在主题的根目录中创建一个名为的文件,该文件将用于输出所有标准帖子。您也可以替换“标准”与任何其他格式的名字,像asidelink或者video,所以如taxonomy-post_format-post-format-video.php。只要您遵循以下格式,这同样适用于其他任何分类法,顺便说一句:taxonomy-{TAXONOMY_NAME}-{TERM_NAME}.php

如果要显示带有自定义循环的帖子格式,例如在边栏中或页面模板中,则可以使用@kaiser中的税收查询。只需用代替分类法,用代替post_format子弹post-format-{FORMAT_NAME}


谢谢,但是我试图在页面模板中创建档案,所以我将采用其他解决方案之一:)
daba 2012年

1

对于两种不同的分类法。对于一个,您relation可以省去arg。

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

0

您可以这样做:

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

这是因为标准帖子格式的get_post_format()返回false。 http://codex.wordpress.org/Function_Reference/get_post_format


确实可以,但是在考虑分页时会遇到麻烦。如果您执行类似操作,'posts_per_page' => 6并且有4个帖子具有NOT标准模板,则您只会看到2个帖子,而看不到应该显示的6个帖子。过滤查询是要走的证明方式..
honk31
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.