Come utilizzare query_posts() con un filtro data su un campo personalizzato?
Ho definito un custom post type che utilizza un meta field per memorizzare le date.
Nel mio functions.php ho il seguente codice che salva la data di inizio. Il formato della data inviato nel parametro startdate
del form è 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"]);
}
Sto cercando di visualizzare un elenco di tutti gli eventi con startdate
successiva all'ora corrente.
query_posts(array(
'post_type' => array('seminar'),
'meta_key=startdate',
'meta_value='.date("Y/m/d h:i A"),
'meta_compare=>'
));
Questo elenca tutti gli eventi indipendentemente dalla loro data di inizio. Cosa sto sbagliando?
RISOLTO:
Per qualche motivo, dopo aver modificato il mio codice come segue, ha iniziato a funzionare.
$args = array(
'post_type' => array('seminar'),
'showposts' => 3,
'meta_key' => 'startdate',
'meta_value' => date("Y/m/d h:i A"),
'meta_compare' => '>',
'orderby' => 'meta_value',
'order' => 'ASC'
);
$seminars = get_posts($args);
Ho selezionato come risposta accettata quella di @Rarst perché penso che avessi effettivamente diversi problemi, ma la sua risposta affrontava meglio la questione relativa al titolo.
@sorich87 aveva ragione sul fatto che avrei dovuto memorizzare le date come timestamp, ma alla fine @Rarst aveva ragione che specificando un argomento di formato alla funzione date()
che corrisponda al formato utilizzato quando memorizzo i dati nel database, allora dovrei essere in grado di confrontare i dati.
Grazie per l'aiuto.

Convertirei la data in un timestamp prima di memorizzarla:
add_action('save_post', 'save_details');
function save_details(){
global $post;
update_post_meta($post->ID, "startdate", strtotime($_POST["startdate"]));
}
E utilizzerei il timestamp corrente per effettuare il confronto:
query_posts(array(
'post_type' => array('seminar'),
'meta_key=startdate',
'meta_value='.time(),
'meta_compare=>'
));

Sfortunatamente, non è sufficiente. I numeri ordinati alfabeticamente vengono ordinati come 1,11,2 invece di 1,2,11. :-) Ciò di cui si ha veramente bisogno è un campo aggiuntivo, secondo me. http://wordpress.stackexchange.com/questions/4852/post-meta-vs-seperate-database-tables/4866#4866

Archivii la data come stringa formattata, ma la funzione time()
che utilizzi per il confronto restituisce un timestamp numerico. Quindi stai cercando di fare un confronto tra due formati completamente diversi ed è improbabile che WordPress sia abbastanza intelligente da capirlo.

C'è un modo per memorizzare la data come Date? Pensavo che l'unico modo per memorizzare metadati personalizzati fosse come stringa.

Beh, non c'è una regola che dice che non puoi salvare un timestamp in una stringa. :) Proverei prima a sostituire time()
con date()
nello stesso formato del tuo campo meta. Penso che dovrebbe funzionare in questo modo.

Ho provato a sostituire con date("Y/m/d h:i A"). Sembra però che non faccia alcuna differenza, anche se pensavo che avrebbe dovuto.

Salva il valore nel database come:
'enddate' => date('Y-m-d');
Genera una meta query come:
A. Condizione:
$conArr[0] = array
(
'key'=> 'enddate',
'value' => date('Y-m-d'),
'compare' => '>=',
);
B. Query:
$args = array(
'meta_query'=>$conArr ,
'post_type'=>'tournament',
'orderby' => 'meta_value_num',
)
Importante: 'orderby' => 'meta_value_num',
e il formato della data sono fondamentali.
