隐藏旧事件自定义帖子类型

时间:2015-07-26 作者:Jeroen

Hello all i am struggling for days now, and i hope one of you can help mei have a custom post type called events and i like to show only events that date is today and upcoming but i couldnt get it to work , what am i doing wrong ?

here is my code so far:

<?php
$paged = ( get_query_var(\'paged\') ) ?get_query_var(\'paged\') : 1;
$today = time();
$events = new WP_Query(array(
    \'post_type\' => \'events\',
    \'posts_per_page\' => \'15\',
    \'paged\' => $paged,        
    \'meta_query\' => array(
         array(
              \'key\' => \'closingdate\',
              \'compare\' => \'>=\',
              \'value\' => $today,                             
           )
      ),
    \'meta_key\' => \'closingdate\',
    \'orderby\' => \'meta_value\',
    \'order\' => \'DESC\',
));
?> 

                   <?php if ($events->have_posts()) :  while ($events->have_posts()) : $events->the_post();?>
            <div class="row">
                    <div class="cell_left"><p><a title="<?php the_title(); ?>" href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a></p></div>
                    <div class="cell"><p class="posted"><?php echo date(\'d-m-Y\', strtotime(get_post_meta($post->ID, "closingdate",true)));?></p></div>                                            
                  </div>
                   <?php endwhile;?>  
            </div>                
            <div class="navigation">      
            <?php wp_pagenavi( array( \'query\' => $events ) ); ?>           
          <?php wp_reset_query();?> 
2 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

您的主要问题是日期格式。虽然另一个答案可以,但它是无效的,并且会导致分页查询中每页的帖子数量不一致。这里的问题是,如果你有100篇文章,而只有10篇文章将来有日期,那么查询额外的90篇文章只是为了在循环中跳过/隐藏它们,这是在浪费大量资源。此外,如果对查询分页,您可能会随机得到包含5篇或两篇帖子的页面,或者根本没有帖子。但我不是来这里批评任何其他帖子的;-)

正如我所说,您的主要问题是日期格式。与date_query 字段,自定义字段按字面顺序排序和比较。这意味着,如果你试图将一个苹果与一个桔子作为水果进行比较,那么在一个自定义字段中,这种比较将失败,因为这是一种预言,而苹果不是同一件事,尽管它们都是水果,但在date_query 比较将通过,因为逻辑是,无论是哪种水果,两者都是水果

time() 返回unix时间戳中的当前时间。您可以通过简单的操作来测试这一点echo time(); 模板中的任意位置。在a中date_query, 有一种逻辑知道这是一个有效的unix时间戳。A.meta_query 认为这是一个没有特殊意义的字面数字。为了进行排序和比较,自定义字段中的日期还必须另存为unix时间戳,才能使用此格式。Any other 格式化将失败。

我认为自定义字段中的日期保存为正常日期,而不是unix时间戳,因此上述内容不适用于time(). 您需要的是date() php中的函数或类似函数以所需格式返回当前时间和日期(注意,保存在自定义字段中的日期格式必须为Y-m-d H:i:s 出于比较或排序目的,任何其他格式都不起作用,句号)。

所以,为了解决您的问题,如果您的日期格式是Y-m-d H:i:s 或者只是Y-m-d, 你only 需要更改以下行

$today = time();

$today = date( \'Y-m-d H:i:s\' );

$today = date( \'Y-m-d\' );
除此之外,您的代码应该可以工作,并且只在今天之后(包括今天)返回帖子

附言wp_reset_query(); 应该是wp_reset_postdata(); ;-)

SO网友:Mahavar Hitesh

Jeroen您的任务是自定义post类型的事件显示,但旧事件不显示,因此您可以使用此代码。请将元值日期和当前日期插入到strotime,以检查日期是否为今天条件。

<?php 
$YOUR_CURRENT_DATE = date(\'d-M-Y\');
$args = array( \'post_type\' => \'event\', \'posts_per_page\' => -1,\'orderby\' => \'menu_order ID\',\'order\'   => \'ASC\' );
$query = new WP_Query( $args );
while ( $query->have_posts() ) : $query->the_post();
$YOUR_METADATE = get_post_meta( $post->ID, \'YOUR_META_DATE\', true );
if(strtotime($YOUR_CURRENT_DATE) <= strtotime($YOUR_METADATE)  ):
?>

        <!--  Your code here -->
        <!--  Old Event is hide -->

<?php 
endif;
endwhile;       
wp_reset_postdata();
?>

结束

相关推荐