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帖子进行排序