【问题标题】:Wordpress custom post type - list only UPCOMING events - not ALL eventsWordpress 自定义帖子类型 - 仅列出即将发生的事件 - 不是所有事件
【发布时间】:2015-03-13 00:01:32
【问题描述】:

我有一个自定义的事件帖子类型,其中包含一个显示 event_date 的字段。 目前,我的代码会引入每一个事件。 我只需要拉入尚未通过的事件。

关于如何只选择将来出现的帖子有什么建议吗? 也就是说,只显示 UPCOMING EVENTS。

到目前为止我的代码(忽略谷歌地图部分)...

<?php
$mapposts = new WP_Query( array( 
'post_status' => 'publish', 
'post_type' => 'tour-date',
'posts_per_page'  => -1
) );
?>

<div class="acf-map">
<?php while ( $mapposts->have_posts() ) : $mapposts->the_post(); ?>
<?php
$location = get_field('event_map');
$gtemp = explode (',',  implode($location));
$coord = explode (',', implode($gtemp));
?>

<div class="marker" data-lat="<?php echo $location[lat]; ?>" data-lng="<?php echo $location[lng]; ?>">

<h1><?php if(get_field('event_date'))
{
$date = DateTime::createFromFormat('Ymd', get_field('event_date'));
echo $date->format('M j');
}                        
?></h1>
<h2><?php the_title(); ?></h2>  
</div>

<?php endwhile; ?>

</div><!-- .acf-map -->


  <?php
    $args=array(        
    'post_type' => 'tour-date',        
    'orderby'=> 'event_date',        
    'order' => 'ASC'        
    );        
    $my_query = null;        
    $my_query = new WP_Query($args);        
    if( $my_query->have_posts() ) {        
    echo '';        
    $i = 0;        
    while ($my_query->have_posts()) : $my_query->the_post();        
    if($i % 3 == 0) { ?> 
  <?php
    }        
    ?>
  <div class="box-shadow">
    <ul class="event">
      <li class="date">
        <?php if(get_field('event_date'))
          {              
          $date = DateTime::createFromFormat('Ymd', get_field('event_date'));              
          echo $date->format('M j');              
          }              
          ?>
      </li>
      <li class="location"><?php the_field('event_city'); ?></li>
      <li class="venue"><?php the_field('event_venue'); ?></li>
      <li class="country"><?php the_field('event_country'); ?></li>
      <li class="details"><a href="<?php the_permalink(); ?>">+ Info</a></li>
      <li class="purchase"><a href="<?php the_field('event_tickets'); ?>" class="purchase" target="_blank">Tickets</a></li>
    </ul>
  </div>
  <!-- /box-shadow -->
  <?php    
    if($i % 3 == 0) { ?> 
  <?php
    }        
    $i++;        
    endwhile;        
    }        
    wp_reset_query();        
    ?>

【问题讨论】:

    标签: php wordpress advanced-custom-fields


    【解决方案1】:

    应该是这样的

    <?php
    $events = get_posts(array(
                    'post_type'     => 'tour-date',
                    'posts_per_page'=> -1,
                    'meta_key'      => 'event_date',
                    'orderby'       => 'meta_value',
                    'order'         => 'ASC'
                ));
    
    foreach($events as $event){
    
        $event_date = get_post_custom_values('event_date',$event->ID);
        $event_date = $event_date[0];
        list($y,$m,$d) = explode('-',$event_date);
        $ym = $y.'-'.$m;
    
    
        if($event_date<date('Y-m-d')) continue;
    ?>
    

    【讨论】:

    • 不幸的是,这破坏了网站。我的代码工作正常,我只需要它停止显示已经过期的日期。
    • 你需要关闭 这将修复它
    • 把你的整个代码放到这个部分。我会编辑它并重新发布答案。如果你想不通,也不仅仅是争论
    • 此方法效率不高,因为您仍在从数据库中请求所有帖子。如果用户有数千个旧事件,则此查询可能会超时。
    【解决方案2】:

    假设您将日期存储为时间戳,您可以在查询中添加 meta_compare 参数...

    <?php
    $args = array(
        'post_type' => 'tour-date',
        'posts_per_page' => -1,
        'meta_key' => 'event_date',
        'meta_value' => current_time( 'timestamp' ),
        'meta_compare' => '>=',
        'orderby' => 'meta_value',
        'order' => 'ASC'
    );
    

    试试看

    丹

    【讨论】:

    • 谢谢 dan,我现在已经在上面发布了完整的查询,以防万一我无法得到它。
    • @lowercase 你试过我的答案了吗?只需用我的 $args 数组替换你的数组,它应该可以工作。虽然我不明白为什么你的代码中有 2 个 wp_query 实例。
    • 你认为我可以结合这两个实例吗?一个控制事件的谷歌地图标记,另一个控制事件列表。
    • 嗨,丹,我添加了新查询,但不幸的是,所有事件仍在列出。还有其他可能有帮助的想法吗?非常感谢。
    • @lowercase 我在回答中写的查询是 100% 正确的。如果它仍然不适合您,我的猜测是在您的页面上有 2 个 wp_query 实例会搞砸它,但我很难说。另一种选择是您没有正确存储您的帖子元数据。尝试在一个完全独立的页面上单独使用我的查询,看看会发生什么。
    【解决方案3】:

    玩了一段时间后,我想出了这个可行的解决方案......

    $event1 = current_time('Ymd');
    $args = array(
        'post_type' => 'tour-date',
        'post_status' => 'publish',
        'posts_per_page' => -1,
        'meta_query' => array(
            array(
            'key' => 'event_date',
            'compare' => '>=',
            'value' => $event1,
            )
            ),
        'meta_key' => 'event_date',
        'orderby' => 'meta_value',
        'order' => 'ASC',
    );
    

    【讨论】:

      【解决方案4】:

      这就是根据我上面的方法编写代码的方式。但我同意 dabbharami 关于调用所有帖子的问题。你的方法看起来不错,所以我认为你将不再需要这个

        <?php
        $events = get_posts(array(
                'post_type'   => 'tour-date',
                'posts_per_page'=> -1,
                'meta_key'    => 'event_date',
                'orderby'     => 'meta_value',
                'order'     => 'ASC'
              ));
      
        $i=0;
        foreach($events as $event){
      
          $event_date = get_post_custom_values('event_date',$event->ID);
          $event_date = $event_date[0];
          list($y,$m,$d) = explode('-',$event_date);
          $ym = $y.'-'.$m;
      
      
          if($event_date<date('Y-m-d')) continue;
        ?>
        <div class="box-shadow">
          <ul class="event">
            <li class="date">
              <?php if(get_field('event_date'))
                {              
                $date = DateTime::createFromFormat('Ymd', get_field('event_date'));              
                echo $date->format('M j');              
                }              
                ?>
            </li>
            <li class="location"><?php the_field('event_city'); ?></li>
            <li class="venue"><?php the_field('event_venue'); ?></li>
            <li class="country"><?php the_field('event_country'); ?></li>
            <li class="details"><a href="<?php the_permalink(); ?>">+ Info</a></li>
            <li class="purchase"><a href="<?php the_field('event_tickets'); ?>" class="purchase" target="_blank">Tickets</a></li>
          </ul>
        </div>
        <!-- /box-shadow -->
        <?php
          $i++;
          if($i==3) break;
        }
        ?>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多