Pre_get_posts filter usando comparação de meta_query numérica (a partir de datas)

Eu tenho um campo ACF de prazo de validade 'post_end_date' que foi aplicado a vários tipos de postagem, incluindo 'post' .

Estou tentando filtrar todas as postagens, em todo o site, onde a data de hoje é maior do que o valor 'post_end_date' ; em outras palavras, a postagem expirou. Eu verifiquei que 'post_end_date' valor 'post_end_date' retorna um número no mesmo formato que a date('Ymd') . por exemplo

 echo date('Ymd'); // returns 20161128 for today echo get_field('post_end_date'); // returns 20161127 for yesterday 

Achei que a melhor maneira seria apenas fazer uma comparação numérica entre a data de hoje e 'post_end_date' valor 'post_end_date' .

Este é o meu código:

  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' => ' 'NUMERIC' ) )); endif; } add_action( 'pre_get_posts', 'expiry_filter' ); 

Neste ponto, eu só estava tentando fazê-lo funcionar para o tipo de postagem 'post' post 'post' . Verifiquei que não usei o operador de “comparação” errado. Eu tentei com e sem o $query->is_main_query() condicional.

O resultado que estou obtendo com o código acima é TODAS as postagens estão sendo filtradas.

Alguém pode sugerir o que eu poderia fazer mal aqui?

Desde já, obrigado.

Solutions Collecting From Web of "Pre_get_posts filter usando comparação de meta_query numérica (a partir de datas)"

Conforme mencionado nos comentários você é um problema na sua meta consulta, conforme você define a chave para 20161126 ou similar. Em vez disso, a key deve ser preenchida com sua meta-chave post_end_date . A consulta Meta também suporta vários arrays para combinar sua consulta e também include postagens onde a meta chave não está definida. O exemplo seria algo como o seguinte:

 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' ); 

Você tentou usar meta_key , meta_value e meta_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' ); 

Ou talvez tentando usar o tipo DATE ao usar 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' ); 

Ou apenas usando a versão limpa de sua function

 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' );