首页 > 解决方案 > 构建 PHP/WordPress 日历

问题描述

我稍微改编了 David Walsh ( https://davidwalsh.name/php-calendar ) 的基于 PHP 的日历。

对于每一天,我希望能够根据日期输出帖子。这适用于日期查询,但不是那么用户友好和未来的帖子,在后台或 /?p=1234 URL 中标记“已调度”时看起来不太好。

这将如何适应使用 ACF 日期选择器字段并与当前日历单元格进行比较以进行输出?

我可以很容易地获取元数据,但这是否可以将元值与循环内的变量进行比较?

然后我可以使用另一个元字段来订购吗?

for($list_day = 1; $list_day <= $days_in_month; $list_day++):

   // FYI day/month/year vars avaliable to use to query
   $list_day;
   $month;
   $year;

   // Reset entries
   $entries = '';

   // Set query arguments
   $args = array(
      'post_type' => 'post',
      'posts_per_page' => -1,
      'meta_key' => 'event_date',
      'meta_query' => array(
         'key' => 'event_date',
         'value' => date( 'dnY' ), 
         'compare' => '>=',
         'type' => 'DATE'
      ),
      'orderby' => array(
         'event_start' => 'DESC'
      ),
      'post_status' => array('publish', 'future')
   );

   // Run query
   $wp_query = new WP_Query($args);

   if($wp_query->have_posts()) : while($wp_query->have_posts()) : $wp_query->the_post();

      // Collect entries
      $entries .= '<a class="calendar-entry" href="'.get_permalink().'">'.get_the_title().'</a>';

   endwhile; endif;

   // Apply class dependant on entries
   if($entries) {
      $day_class = 'has-entries';
   } else {
      $day_class = 'no-entries';
   }

   // Start calendar cell
   $calendar.= '<div class="calendar-day '.$day_class.'"><div class="inner">';
   $calendar.= '<div class="day-number">'.$list_day.'</div>';

   // If entries, print on calendar cell
   if($entries) {
      $calendar.= '<div class="entries">'.$entries.'</div>';
   }

   // End calendar cell
   $calendar.= '</div></div>';

endfor;

我猜这样的事情不是通过查询所有帖子来实现的最佳方法吗?

if($wp_query->have_posts()) : while($wp_query->have_posts()) : $wp_query->the_post();

   // Get event date
   $event_date = get_field('event_date');

   $event_dates = explode('/',$event_date);
   $event_day = $event_dates[0];
   $event_month = $event_dates[1];
   $event_year = $event_dates[2];

   if($event_day == $list_day && $event_month == $month && $event_year == $year) {

      $entries .= '<a class="calendar-entry '.$month.'" href="'.get_permalink().'">'.get_the_title().'</a>';

   }

endwhile; endif;

标签: phpwordpressdatepickermetadataadvanced-custom-fields

解决方案


显然我的大脑今天早上没有醒来!

$search_day = $year.$month.$list_day;

$args = array(
   'post_type' => 'post',
   'posts_per_page' => -1,
   'order' => 'ASC',
   'orderby' => 'meta_value_num',
   'meta_key' => 'event_start_time',
   'meta_query' => array(
      array(
         'key' => 'event_date',
         'value' => $search_day
      )
   )
);

推荐阅读