WordPress 查询:按年份 DESC 对帖子进行分组,然后在每个组中按月 ASC 发布帖子

Posted

技术标签:

【中文标题】WordPress 查询:按年份 DESC 对帖子进行分组,然后在每个组中按月 ASC 发布帖子【英文标题】:WordPress query: Group posts by year DESC, then posts by month ASC within each group 【发布时间】:2020-07-22 07:48:57 【问题描述】:

我正在尝试设置一个 WordPress 查询和循环,以便事件按降序顺序按年份分组,每年有一个标题,然后按升序按月份排序 每年组的顺序,如下所示:

2020

2020 年 1 月 1 日 2020 年 2 月 1 日 2020 年 3 月 1 日

2019

2019 年 1 月 1 日 2019 年 2 月 1 日 2019 年 3 月 1 日

我在这里找到了一些指向正确方向的有用线程,例如 this one,它使用直接 SQL 查询来按年份获取帖子,然后在 WP_Query 上运行通常的循环来分组和排序每个组内的帖子。然而,就我而言,我没有使用post_date,而是有一个event_end_date 的自定义字段(使用高级自定义字段),它应该定义帖子和组定义的顺序。

链接示例中的 SQL 查询是

$sql = "SELECT DISTINCT(YEAR(`post_date`)) as years FROM $posts WHERE post_type = 'testimonials' ORDER BY years DESC"; //Get all post year list by DESC

$result = $wpdb->get_results($sql);

foreach($result as $rs) 
    echo '<h2>'.$rs->years.'</h2>';
    $args = array(
        'post_type' => 'event',
        'post_per_page'=> -1,
        'post_status' => 'publish',
        'orderby'   => 'date',
        'order' => 'DESC',
        'date_query' => array(array(
            'year'=> $rs->years,
        ),),

    );

     $loop = new WP_Query($args);

     if($loop->have_posts()) 

        while($loop->have_posts()) : $loop->the_post();

            echo '<a href="'.get_permalink().'">'.get_the_date().'</a>';
        endwhile;

     

我不太确定如何修改它,以便我可以查询 event_end_date 自定义字段,并形成年份组,然后我可以在其中列出按月 ASC 排序的帖子。

我假设我需要在这里使用手动 SQL 查询,因为典型的 WP_Query 不允许以两种不同的方式进行排序,正如我所描述的那样?我可以轻松地将事件输出到带有每年标题的组中,但只能以一组顺序,即 ASC 或 DESC。感谢您在这里提供的任何帮助,如果有任何不清楚的地方,请告诉我。

【问题讨论】:

SELECT * FROM $posts WHERE post_type = 'testimonials' ORDER BY year(post_date) DESC, month(post_date) asc, day(post_date) asc 感谢@lufc 的回复,但我正在尝试使用自定义字段event_end_date 来组成组并排序帖子,如我原来的帖子中所述。 在这种情况下,听起来您的问题是“如何将多个 ORDER BY 语句应用于 Wordpress 中的自定义字段”。你可以在这里看到:advancedcustomfields.com/resources/orde-posts-by-custom-fields 和这里:wordpress.stackexchange.com/questions/65769/… @lufc 我了解如何使用多个 orderby 值以及如何使用自定义字段设置订单 - 我正在尝试获取帖子中描述的条目组 创建查询以列出所有事件,按年和月排序。当您循环访问事件时,只需检查当前行的年份是否等于前一行的年份,如果不等于则插入一些 html 来创建新组。 【参考方案1】:

如果您使用的是高级自定义字段的“日期选择器”,您可以按照以下方式按帖子的自定义字段 WP_Query 进行排序:

<?php 
$year = '';
$args = array(
    'posts_per_page'    => -1,
    'meta_key'          => 'event_end_date',
    'orderby'           => 'meta_value_num',
    'order'             => 'DESC',
);
$the_query = new WP_Query( $args );
?>      
<?php if ( $the_query->have_posts() ) : ?>
    <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>

        <?php

        // create the date variables
        $event_date_string = get_field('event_end_date');
        $event_date = DateTime::createFromFormat('Ymd', $event_date_string);
        $event_year = $event_date->format('Y');

        // add header for each year
        if ($year != $event_year) :
           echo '<div><b>' . $event_year . '</b></div>';
           $year = $event_year;
        endif;

        // echo out current post
        echo '<div>' . $event_date . ': ' . get_the_title() . '</div>';

        ?>

    <?php endwhile; ?>
    <?php wp_reset_postdata(); ?>
<?php endif; ?>

解释:

    创建一个 $year 变量来跟踪当前年份 使用 WP_Query 获取所有帖子并按 DESC 顺序按“event_end_date”排序 遍历帖子并获取我们用来更新 $year 变量的每个帖子的事件年份

更多信息在这里: https://www.advancedcustomfields.com/resources/date-picker/

【讨论】:

嗨@tokant,我很欣赏您的回复,但这基本上是我已经在做的事情。我的问题是如何改变顺序 - 即按 DESC 顺序排列年份组,按 ASC 顺序排列每个组内的事件,如我的问题中所述。

以上是关于WordPress 查询:按年份 DESC 对帖子进行分组,然后在每个组中按月 ASC 发布帖子的主要内容,如果未能解决你的问题,请参考以下文章

按年份“query_posts()”问题的 Wordpress 存档

php 按对象属性对对象数组进行排序。示例:查询后对Wordpress帖子进行排序

WP Elementor:按日期过滤存档帖子(例如通过自定义查询)

PHP 查询按类别获取帖子 - Wordpress

PHP Wordpress帖子的选项[年份]

按类别查询获取帖子-Wordpress