【问题标题】:WordPress - Get Posts by DateWordPress - 按日期获取帖子
【发布时间】:2014-06-18 17:04:23
【问题描述】:

我正在尝试弄清楚如何构建一个按日期获取帖子的 WordPress 查询。

我的意思是,我想要一种方法来输出我的 WordPress 帖子,如下所示:

<div class="day-posts">
     <div class="day">
          <div class="title">Monday 1st January 2014</div>
          <div class="posts">
               <div class="post">
                    <div class="title">Post for this day</div>
                    <div class="content">Lorum ipsum dolar sit amet</div>
               </div>
          </div>
     </div>
     <div class="day">
          <div class="title">Tuesday 2nd January 2014</div>
          <div class="posts">
               <div class="post">
                    <div class="title">Post for this day</div>
                    <div class="content">Lorum ipsum dolar sit amet</div>
               </div>
          </div>
     </div>
</div>

这也需要使用“post_status=future”查询选项处理尚未发布的帖子。

我花了大约一个小时在网上搜索是否有人以前做过类似的事情,但不幸的是我没有找到任何可行的方法。

我自己也对此进行了一些尝试,但不幸的是,我无法想出任何可行的方法。

是否有人对如何做到这一点有一些建议或见解?

谢谢

【问题讨论】:

  • 我已阅读您的问题,但不知道您要完成什么。您想按日期列出未来的帖子,从某个日期开始,然后按升序排列?
  • 它应该适用于所有帖子,包括已发布和已安排的帖子(因此是帖子状态变量)。是的,我想按天列出帖子,我打算使用 jQuery 一次显示一天,用箭头导航到下一个或上一个日期。
  • 您确定要显示这些吗?当设置为未来日期时,单个模板循环将不会显示 NONE EDITORS 也就是普通用户的内容,当您使用上述内容时会产生更多问题
  • 我正在做的事情不会有一个单一的页面模板。我正在查询自定义帖子类型,结果只会显示在一个页面上,没有链接或需要单个模板。
  • WP_Query orderby post_date 不起作用吗? WP Query Codex 还是我在这里遗漏了一个关键点?

标签: php date wordpress


【解决方案1】:
<?php
$query = new WP_Query(array('orderby' => 'post_date', 'order' => 'DESC')); //Orders posts by post_date in descending order

// The Loop
if ($query->have_posts()) {
    echo '<div class="day-posts">';
    while ($query->have_posts()) {
        $query->the_post();
        echo '<div class="day">';
        the_date('l jS F Y', '<div class="title">', '</div>'); //Formats date, before echo, after echo
        echo '<div class="posts">';
        echo '<div class="post">';
        the_title('<div class="title">', '</div>'); //echo title
        echo '<div class="content">';
        the_content(); //echo content
        echo '</div></div></div></div>';
    }
    echo '</div>';
}
?>

我在几分钟内完成了这个,很抱歉我没有将它连接起来,但你可以做到。

【讨论】:

    【解决方案2】:

    虽然乍一看它看起来像一个简单的任务,但要使用单个查询构建嵌套循环却很棘手。

    第一步是建立一个查询,为了演示,我将按升序(order=asc)和任何帖子状态(post_status=any)获取所有帖子(posts_per_page=-1)。可以使用 'post_status' =&gt; array( 'publish', 'future' ) ( documentation ) 之类的参数数组来更改帖子状态。

    下一步是构建帖子的多维数组:

    $posts_by_day = array_reduce( $query->posts, function( $r, $v ) {
        $r[ date( 'Y-m-d', strtotime( $v->post_date ) ) ][] = $v;
        return $r;  
    });
    

    一个看起来像这样的数组:

    大批 ( [2014-03-17] => 数组 ( [0] => WP_Post 对象 ( ... ) [1] => WP_Post 对象 ( ... ) ) [2014-03-24] => 数组 ( [0] => WP_Post 对象 ( ... ) [1] => WP_Post 对象 ( ... ) [2] => WP_Post 对象 ( ... ) ) ... )

    最后循环遍历一个数组,在外循环中按日期,在内循环中按该日期的帖子。 setup postdata() 用于设置全局帖子数据,以便模板标签可以在当前帖子上下文中工作。

    <?php
        $query = new wp_query( 'post_status=any&order=asc&posts_per_page=-1' );
    
        $posts_by_day = array_reduce( $query->posts, function( $r, $v ) {
            $r[ date( 'Y-m-d', strtotime( $v->post_date ) ) ][] = $v;
            return $r;  
        });
    ?>
    
    <?php if ( $posts_by_day ) : ?>
        <div class="day-posts">
        <?php foreach( $posts_by_day as $day => $day_posts ) : ?>
            <div class="day">
                <div class="title"><?php echo date( 'l jS F Y', strtotime( $day ) ); ?></div>
                <div class="posts">
                <?php foreach( $day_posts as $post ) : setup_postdata( $post ); ?>
                    <div class="post">
                        <div class="title"><?php the_title(); ?></div>
                        <div class="content"><?php the_content(); ?></div>
                    </div>          
                <?php endforeach; ?>
                </div>
            </div>  
        <?php endforeach; wp_reset_postdata(); ?>
        </div>
    <?php endif; ?>
    

    【讨论】:

    • 嘿。 Brandon Gelfand 已经发布了一个似乎可行的解决方案。我也将测试你的,看看它是如何工作的。我很感激你的回答。正如您所说,这最初看起来像一个简单的问题,但实际上很难!在发帖之前我花了几个小时试图解决它,所以谢谢!
    • Brandon 的解决方案仅在您每天发布一篇文章时才有效。
    • 这不是真的。我每天用多个帖子对其进行测试。
    猜你喜欢
    • 1970-01-01
    • 2018-05-24
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多