我正在使用 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...)
?>
现在我得到这样的结果:
10 月
一月
十二月
5 月
...
顺序基于发布日期而不是基于自定义字段。 年份之间也没有区别。 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
) );
现在的问题只是年份。都是按月排序,每个月的年份不同。
最佳答案
您从@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();
关于php - WordPress:按自定义日期字段订购 WP_Query 并在每个月后拆分循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46494231/
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/
这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些
有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我
为什么以下不同?Time.now.end_of_day==Time.now.end_of_day-0.days#falseTime.now.end_of_day.to_s==Time.now.end_of_day-0.days.to_s#true 最佳答案 因为纳秒数不同:ruby-1.9.2-p180:014>(Time.now.end_of_day-0.days).nsec=>999999000ruby-1.9.2-p180:015>Time.now.end_of_day.nsec=>999999998
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s