Como usar query_posts () com um filtro de data em um campo personalizado?

Eu definei um tipo de postagem personalizado que usa um meta-campo para armazenar datas.

Em minhas funções.php eu tenho o seguinte código que salva a data de início. O formato da data que é enviada no parâmetro do formulário startdate é 2010/12/01 9:00 AM

 add_action('save_post', 'save_details'); function save_details(){ global $post; update_post_meta($post->ID, "startdate", $_POST["startdate"]); } 

Estou tentando exibir uma lista de todos os events com uma data de início posterior à hora atual.

 query_posts(array( 'post_type' => array('seminar'), 'meta_key=startdate', 'meta_value='.date("Y/m/dh:i A"), 'meta_compare=>' )); 

Isso lista todos os events, independentemente da data de início. O que estou fazendo de errado?

SOLUÇÃO:

Por algum motivo depois que eu mudei meu código para o seguinte, ele apenas funciona.

 $args = array( 'post_type' => array('seminar'), 'showposts' => 3, 'meta_key' => 'startdate', 'meta_value' => date("Y/m/dh:i A"), 'meta_compare' => '>', 'orderby' => 'meta_value', 'order' => 'ASC' ); $seminars = get_posts($args); 

Eu vou selecionar a resposta da @Rarst como aceita, porque acho que eu realmente tive vários problemas acontecendo aqui, mas ele abordou o assunto relacionado melhor ao título.

@ sorich87 teve um bom ponto sobre como eu deveria ter armazenado as datas como timestamps, mas no final, o @Rarst estava correto que, se eu especificasse um argumento de formato para a function date() que corresponde ao formato que usei ao armazenar os dados no database, então eu poderia ser capaz de comparar os dados.

Obrigado por toda a ajuda.

Solutions Collecting From Web of "Como usar query_posts () com um filtro de data em um campo personalizado?"

Você armazena a data como uma string formatada, mas a function time() você toma para comparação retorna o timestamp numérico. Então você está tentando fazer comparação entre formatos completamente diferentes e é improvável que o WP seja inteligente o suficiente para conseguir isso.

Eu converteria a data para um timestamp antes de armazená-lo:

 add_action('save_post', 'save_details'); function save_details(){ global $post; update_post_meta($post->ID, "startdate", strtotime($_POST["startdate"])); } 

E use o timestamp atual para fazer a comparação:

 query_posts(array( 'post_type' => array('seminar'), 'meta_key=startdate', 'meta_value='.time(), 'meta_compare=>' )); 

Talvez isso faça o truque?

 query_posts(array( 'post_type' => array('seminar'), 'meta_key' => 'startdate', 'orderby'=> 'meta_value', 'order' => 'ASC' )); 
  1. Salve o valor no database, como:

     'enddate' => date('Ym-d'); 
  2. Gerar meta consulta como:

Uma condição :

 $conArr[0] = array ( 'key'=> 'enddate', 'value' => date('Ym-d'), 'compare' => '>=', ); 

B. Consulta:

 $args = array( 'meta_query'=>$conArr , 'post_type'=>'tournament', 'orderby' => 'meta_value_num', ) 

Importante 'orderby' => 'meta_value_num', e o formato da data é importante.