按自定义字段日期排序

时间:2016-06-23 01:39:25

标签: php wordpress date custom-fields

我用它来列出所有帖子标题......

<?php
$args = array(
    'posts_per_page'    => -1,
    'post_type'         => 'post',
    'post_status'       => 'publish',
    'orderby'           => 'title',
    'order'             => 'ASC'
);

query_posts($args);
if (have_posts()) :
    while (have_posts()) :
    the_post(); ?>
<p>
    <?php the_title(); ?>
</p>
<?php endwhile;
    endif;
    wp_reset_query();
?>

......这很好。

我的每个帖子都有一个名为start_date的自定义字段。所有这些开始日期都以DD-MM-YYYY格式输入(例如:10-03-2016)。

我需要做的事情(如果可以做到的话,我就不会这样做)是按start_date(而不是title)订购。

进一步说明,如果有3个帖子的开始日期如此......

  

Post 1:01-11-2016

     

Post 2:03-01-2016

     

Post 3:12-07-2016

......帖子将按照......的顺序显示。

  

发布2

     

发布3

     

发布1

...因为这是正确的日期顺序。

我希望这是有道理的。

干杯。

1 个答案:

答案 0 :(得分:0)

在wordpress WP_Query类中,accept args为post过滤器提供了更多帮助。 您可以在官方站点文档中检查提供自定义元字段接受查询args的顺序和orderby。

https://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters

在这种情况下我有两种处理方法。

  1. 您在开始日期的日期格式不是正确的mysql日期格式(YYYY-MM-DD)。如果您的日期格式与mysql格式相同,那么您只需要更改查询参数:
  2.   $args = array(
        'posts_per_page'    => -1,
        'post_type'         => 'post',
        'meta_key'          => 'start_date',
        'post_status'       => 'publish',
        'orderby'           => 'meta_value',
        'meta_type'         => 'DATE',
        'order'             => 'ASC'
    );
    
    1. 如果您不想在每个帖子上更改日期格式,或者您在每个帖子上有很多帖子难以更改日期格式,那么您可以添加过滤器来覆盖订单参数。
    2. 完整代码

      <?php
          $args = array(
              'posts_per_page'    => -1,
              'post_type'         => 'post',
              'post_status'       => 'publish',
              'meta_key'          => 'start_date',
              'orderby'           => 'title',
              'order'             => 'ASC'
          );
      add_filter( 'posts_orderby', function($orderby){
       return 'STR_TO_DATE( wp_postmeta.meta_value, "%d-%m-%Y") ASC';
      });
      query_posts($args);
      if (have_posts()) :
          while (have_posts()) :
          the_post(); ?>
      <p>
          <?php the_title(); ?>
      </p>
      <?php endwhile;
          endif;
          wp_reset_query();
      ?>
      

      希望这对你说英语不好有帮助。