将高级自定义字段与Date Time Piker的附加组件一起使用,我使用年,日,时间(上午和下午)的信息填充日历。
在日历列表页面上,我有一个查询,由于某种原因,它会跳过2月并重复3月两次。
以下是代码:
<?php
$today = date('Ymd h:i:s a', time() - 60 * 60 * 24);
#start from current month. Change 2 to however months ahead you want
for ($x=0; $x<=6; $x++) {
$date = new DateTime("$x months");
$date->modify("-" . ($date->format('j')-1) . " days");
#echo $date->format('j, m Y');
$month = $date->format('m');
$year = $date->format('Y');
#echo 'Month= '.$month .' Year= '.$year.' <br>'; #debug
$rows = $wpdb->get_results($wpdb->prepare(
"
SELECT *
FROM wp_postmeta
WHERE meta_key LIKE %s
AND meta_value LIKE %s
ORDER BY meta_value ASC
",
'show_date_time_%_show_date', // meta_name: $ParentName_$RowNumber_$ChildName
#''.$year.''.$month.'%' // meta_value: 20131031 for example
''.$year.''.$month.'%' // meta_value: 20131031 for example
));
// loop through the results
if( $rows ) {
echo '<div class="month">';
echo '<h2>'.$date->format('F').' '.$date->format('Y').'</h2>';
echo '<ul>';
foreach( $rows as $row ) {
// for each result, find the 'repeater row number' and use it to load the sub field!
preg_match('_([0-9]+)_', $row->meta_key, $matches);
$meta_key = 'show_date_time_' . $matches[0] . '_show_date'; // $matches[0] contains the row number!
// today or later
$showDate = $row->meta_value;
$do_current = ($showDate > $today);
if ( $do_current || $continue ) :
$show_title = get_the_title( $row->post_id );
$machine_name = preg_replace('@[^a-z0-9-]+@','-', strtolower($show_title));
$post_type = get_post_type($row->post_id);
if( $post_type === 'pre-post-show' ){
// echo 'pre-post-show matching';
$postID = $row->post_id;
$posts = get_field('pre_post_related_show', $postID);
if( $posts ){
foreach( $posts as $post): // variable must be called $post (IMPORTANT)
setup_postdata($post);
$related_show = get_the_title($post->ID);
$related_show_machine = preg_replace('@[^a-z0-9-]+@','-', strtolower($related_show));
endforeach;
wp_reset_postdata(); // IMPORTANT - reset the $post object so the rest of the page works correctly
}
}// post type define
?>
有关为何会发生这种情况的任何想法?
答案 0 :(得分:0)
嗯,它看起来有点棘手。在此stackoverflow post中,您将找到对此“奇怪”行为的完整解释。总结一下:
+1 month
将月份数(原来为1)增加1。这使得日期2015-02-31。这就是为什么你第二次看到第3个月的原因。怎么解决这个问题?好吧,在帖子中我告诉你有一些解决这个“问题”的方法。如果您有php 5.3或更高版本,我建议:
$date = new DateTime();// Now.
for ($x=0; $x<=6; $x++) {
($x) ? $date->modify( 'first day of next month' ) : NULL;// It should give you next month from $x=0 onwards. Output: 01,02,03,04,05,06,07
....// Your code comes here
希望它有所帮助。
<强>更新强>
有很多关于日期和PHP的文档。 DateTime类对于处理日期非常方便。检查其modify方法以更改日期。最后,看看不同的日期和时间supported formats。特别是relative formats,如果您有兴趣使用“+7天”等字符串修改日期。
最后,请查看wpdb文档。类wpdb允许您与wp中的数据库进行交互。您需要学习一些SQL才能进行查询。互联网上有数百个页面(更不用说书籍)可以帮助你学习。
例如,如果您想要检索接下来7天内的所有帖子,您可以执行以下操作:
$now_date = (new DateTime())->format("Y-m-d");
$next_seven_days = (new DateTime("+7 day"))->format("Y-m-d");
$query = "SELECT * FROM wp_posts WHERE post_date >= '$now_date' AND post_date < '$next_seven_days'";
$rows = $wpdb->get_results( $query, OBJECT );
注意:由于没有来自用户/访问者的输入,也无法影响查询,为简单起见,我不打算使用prepare
。无论如何,我必须说系统地使用它是一种好习惯。