使用数字META_QUERY比较的PRE_GET_POST筛选器(从日期)

时间:2016-11-29 作者:Rhecil Codes

我有一个到期日ACF字段\'post_end_date\' 已应用于多种岗位类型,包括\'post\'.

我试图过滤掉整个网站上所有今天的日期大于值的帖子\'post_end_date\'; 换句话说,这篇文章已经过期了。我查过了\'post_end_date\' 值返回与相同格式的数字date(\'Ymd\'). e、 g。

echo date(\'Ymd\'); // returns 20161128 for today
echo get_field(\'post_end_date\'); // returns 20161127 for yesterday
我想最好的方法就是把今天的日期和\'post_end_date\' 价值

这是我的代码:

  function expiry_filter($query) {

    if( !is_admin() && $query->is_main_query() ) :

      $today = $expire = date(\'Ymd\');

      if ( get_field(\'post_end_date\') ) :
        $expire = get_field(\'post_end_date\');
      endif;

      $query->set( \'meta_query\', array(
        array(
         \'key\'     => $expire,
         \'value\'   => $today,
         \'compare\' => \'<\',
         \'type\'    => \'NUMERIC\'
        )
      ));

    endif;
  }
  add_action( \'pre_get_posts\', \'expiry_filter\' );
在这一点上,我只是想让它为\'post\' 岗位类型。我已检查是否使用了错误的“比较”运算符。我试过有没有$query->is_main_query() 有条件的

以上代码的结果是所有帖子都被过滤掉了。

有人能告诉我我这里做错了什么吗?

提前谢谢。

2 个回复
最合适的回答,由SO网友:Fabian Marz 整理而成

正如评论中所提到的,当您将键设置为20161126 或类似。相反key 应该用元密钥填充post_end_date. Meta query 还支持多个数组来组合查询,以包括未设置元键的帖子。示例如下:

function expiry_filter($query) {
  if( !is_admin() && $query->is_main_query() ) {
    $expire = get_field(\'post_end_date\') ? : date(\'Ymd\');
    $query->set( \'meta_query\', [
      \'relation\' => \'OR\',
      [
       \'key\'     => \'post_end_date\',
       \'value\'   => $expire,
       \'compare\' => \'>=\',
       \'type\'    => \'NUMERIC\',
      ],
      [
       \'key\'     => \'post_end_date\',
       \'compare\' => \'NOT EXISTS\',
      ],
    ]);
  }
}
add_action( \'pre_get_posts\', \'expiry_filter\' );

SO网友:sMyles

您是否尝试过使用meta_key, meta_valuemeta_compare?

function expiry_filter( $query ) {

    if ( ! is_admin() && $query->is_main_query() ) :

        $query->set( \'meta_key\', \'post_end_date\' );
        $query->set( \'meta_value\', date(\'Ymd\') );
        $query->set( \'meta_compare\', \'>\' );

    endif;
}

add_action( \'pre_get_posts\', \'expiry_filter\' );
或者尝试使用DATE 使用时键入meta_query?

function expiry_filter( $query ) {

  if ( ! is_admin() && $query->is_main_query() ) :

      $query->set( \'meta_query\', array(
          array(
              \'key\'     => \'post_end_date\',
              \'value\'   => date( \'Ymd\' ),
              \'compare\' => \'>=\',
              \'type\'    => \'DATE\'
          )
      ) );

  endif;
}
add_action( \'pre_get_posts\', \'expiry_filter\' );
或者只是使用清理后的函数版本

function expiry_filter( $query ) {

  if ( ! is_admin() && $query->is_main_query() ) :

      $query->set( \'meta_query\', array(
          array(
              \'key\'     => \'post_end_date\',
              \'value\'   => date( \'Ymd\' ),
              \'compare\' => \'>\',
              \'type\'    => \'NUMERIC\'
          )
      ) );

  endif;
}
add_action( \'pre_get_posts\', \'expiry_filter\' );

相关推荐

WPQuery Date and ACF

我正在创建一个查询,需要按ACF日期字段进行筛选。在数据库中(wp\\u post\\u meta table中)的值如下:MM/DD/YYYY我有几个房间,在date\\u available\\u from字段中的值为:2021 06月01日2021 08月21日2021 08月31日2021 09月06日2021 07月30日2021 11月31日2021 12月31日ul>然后我像这样进行查询:$args[1] = array( \'posts_per_page\' => -1