我正在使用WordPress自定义帖子类型来管理和显示我网站上的活动。 要对事件进行排序我正在使用带有日期的自定义元字段(存储方式如下:YYYY-MM-DD)。我检查当前日期的元字段。像这样:
$current_date_query = date ('Y-m-d');
$temp = $wp_query; $wp_query= null; $wp_query = new WP_Query();
$wp_query->query(
array(
'post_type' => 'event',
'meta_key' => 'event_date',
'meta_compare' => '>=',
'meta_value' => $current_date_query,
'post_status' => 'publish',
'posts_per_page' => '99',
'orderby' => 'meta_value',
'order' => 'ASC',
'paged' => $paged
)
); ?>
... Loop stuff ...
<?php endif; $wp_query = null; $wp_query = $temp; wp_reset_query(); ?>
我现在想在每个新月之前添加标题。像这样:
2018年1月
2018年2月
2018年3月
依旧......
有没有办法在每个月之后拆分循环? 我想我必须使用元字段中的月份,但我不知道如何。
我尝试了以下解决方案(感谢@FluffyKitten的评论):
<?php
/* declare an array to save the data */
$quarters = array();
foreach($posts as $q) {
$donor_date = get_post_meta($q->ID,'gid_22',true);
$donor_month = date('m',strtotime($donor_date));
/* format the date once - best practice is not to repeat code */
$formatteddate = date('d/m/Y',strtotime($donor_date));
/* organise the dates by quarter, using the heading as the key for easy display */
if(in_array($donor_month, array('01')))
$quarters["January"][] = $formatteddate;
else if(in_array($donor_month, array('02')))
$quarters["February"][] = $formatteddate;
else if(in_array($donor_month, array('03')))
$quarters["March"][] = $formatteddate;
else if(in_array($donor_month, array('04')))
$quarters["April"][] = $formatteddate;
else if(in_array($donor_month, array('05')))
$quarters["May"][] = $formatteddate;
else if(in_array($donor_month, array('06')))
$quarters["June"][] = $formatteddate;
else if(in_array($donor_month, array('07')))
$quarters["July"][] = $formatteddate;
else if(in_array($donor_month, array('08')))
$quarters["August"][] = $formatteddate;
else if(in_array($donor_month, array('09')))
$quarters["September"][] = $formatteddate;
else if(in_array($donor_month, array('10')))
$quarters["Ocotber"][] = $formatteddate;
else if(in_array($donor_month, array('11')))
$quarters["November"][] = $formatteddate;
else if(in_array($donor_month, array('12')))
$quarters["December"][] = $formatteddate;
}
/* now go through your array and display the results */
foreach ($quarters as $quartername => $quarter){
/* $quarters won't have any entry for quarters with no dates, so technically this 'if' isn't needed,
however I've added it in case it will be needed it for any other changes you make */
if ($quarter){ ?>
<h3><?php echo $quartername; ?></h3>
<table>
<?php foreach ($quarter as $qdate ){ ?>
<tr><td> <?php echo $qdate; ?> </td></tr>
<?php } // end foreach($quarter...) ?>
</table>
<?php
} // end if
} // end foreach($quarters...)
?>
现在我得到这样的结果:
Ocotber
一月
腊
可以
...
订单基于发布日期,而不是基于自定义字段。 几年之间也没有区别。 2017年应该有它自己的循环以及2018年。
如果我尝试将自己的数组放在循环的第一个数组中,它就没有效果,它只在前端显示为文本。
编辑:我可以使用这样的自定义查询订购月份:
$posts = query_posts( array(
'post_type' => 'event',
'meta_key' => 'event_date',
'meta_compare' => '>=',
'meta_value' => $current_date_query,
'post_status' => 'publish',
'posts_per_page' => '99',
'orderby' => 'meta_value',
'order' => 'ASC',
'paged' => $paged
) );
现在问题只是一年。按月分类,每月不同年份。
答案 0 :(得分:1)
您可以将当前循环月份存储在变量中,并检查您是否仍在同一个月内循环。
假设$events
是要显示为WP_Post
实例的所有事件的数组。
$current = 0;
foreach($events as $event){
$eventDate = get_field('event_date', $event->ID);
$month = date('m', strtotime($eventDate));
// New month
if($current != $month){
$current = $month;
// Perform actions of new month
}
// Perform normal actions for the event
}
答案 1 :(得分:1)
你从@FluffyKitten尝试的解决方案没有正常工作,因为它分组到同一个月的组中,而不是同一个月和一年,所以当不同年份的同一个月有帖子时会崩溃
正如@ChinLeung建议您需要将当前月份存储在变量中以测试它何时发生变化并输出标题。要为您的示例实现此功能,您将执行以下操作:
// Set current month
$current_month = '';
// Get event posts in order
$events = query_posts( array(
'post_type' => 'event',
'meta_key' => 'event_date',
'meta_compare' => '>=',
'meta_value' => date ('Y-m-d'),
'meta_type' => 'DATE',
'post_status' => 'publish',
'posts_per_page' => '99',
'orderby' => 'meta_value',
'order' => 'ASC',
'paged' => $paged
) );
// Iterate over events
foreach($events as $key => $event){
// Get event date from post meta
$event_date = get_post_meta($event->ID, 'event_date', $single = true);
// Cache event month/year
$event_month = date('F Y', strtotime($event_date));
// Open new group if new month
if($current_month != $event_month){
if($key !== 0) echo '</ul>';
echo "<h2>{$event_month}</h2>";
echo '<ul>';
}
// Add event date as new list item
echo "<li>{$event_date}</li>";
// Cache $curret_month
$current_month = $event_month;
}
// Close the last list if query had events
if(count($events)) echo '</ul>';
要更新此解决方案以适用于帖子类型存档,而不是上述内容,请将以下内容添加到主题的functions.php或其中包含的文件中:
/**
* Get event date
*
* @return string
*/
function get_event_date() {
/** @global WP_Post $post */
global $post;
/** Get event date from post meta */
return get_post_meta($post->ID, 'event_date', $single = true);
}
/**
* Get event month/year formatted
*
* @param string $event_date
*
* @return string
*/
function format_event_date($event_date) {
return date('F Y', strtotime($event_date));
}
/**
* Order events archive by event date post meta
*
* @param WP_Query $query
*
* @return WP_Query
*/
function events_archive_pre_get_posts($query) {
if (!$query->is_main_query() || !is_post_type_archive('event')) return $query;
$query->set('meta_key', 'event_date');
$query->set('meta_compare', '>=');
$query->set('meta_value', date('Y-m-d'));
$query->set('meta_type', 'DATE');
$query->set('posts_per_page', 2);
$query->set('orderby', 'meta_value');
$query->set('order', 'ASC');
return $query;
}
add_filter('pre_get_posts', 'events_archive_pre_get_posts');
然后,您可以将每页的帖子设置为所需的数量,并且分页将按预期工作。这是一个示例的帖子类型存档模板,可用于在整齐格式化的HTML列表之间添加日期标题,或者至少它们是在SO标签转换为空格之前:
<?php // Template header
get_header(); ?>
<?php /** @global WP_Query */
global $wp_query; ?>
<?php // Events archive loop
for($previous_month = ''; have_posts(); $previous_month = $formatted_date): the_post();
// Get event date from post meta
$event_date = get_event_date();
// Format event month/year
$formatted_date = format_event_date($event_date);
// The formatted date is the first or not the same as previous event
if($previous_month != $formatted_date):
// Close previous list if this is not the first
if($wp_query->current_post !== 0) echo "\n\t</ul>\n";
// New month template ?>
<h2><?php echo $formatted_date; ?></h2>
<?php
// Open new list
echo "\t<ul>\n";
endif;
// Event post template ?>
<li><?php echo $event_date; ?></li>
<?php endfor;
// Reset query
wp_reset_query();
// Close the last list if query had events
if(have_posts()) echo "\t</ul>\n"; ?>
<?php // Pagination
the_posts_pagination(); ?>
<?php // Template footer
get_footer();