Come utilizzare query_posts() con un filtro data su un campo personalizzato?

29 set 2010, 20:57:27
Visualizzazioni: 15.9K
Voti: 2

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.

0
Tutte le risposte alla domanda 4
2

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=>'
));
29 set 2010 22:54:48
Commenti

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

Denis de Bernardy Denis de Bernardy
6 dic 2010 21:00:16

Sì, hai ragione.

sorich87 sorich87
7 dic 2010 02:28:21
4

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.

29 set 2010 21:11:29
Commenti

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

jessegavin jessegavin
29 set 2010 21:19:36

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.

Rarst Rarst
29 set 2010 21:26:59

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.

jessegavin jessegavin
29 set 2010 22:24:59

La tua risposta ha risolto il problema principale che stavo riscontrando. Grazie

jessegavin jessegavin
29 set 2010 23:53:31
2

Forse questo potrebbe funzionare?

query_posts(array(
    'post_type' => array('seminar'),
    'meta_key' => 'startdate',
    'orderby'=> 'meta_value',
    'order' => 'ASC'
));
29 set 2010 23:10:51
Commenti

Il tuo codice modifica order, mentre la domanda originale chiede di applicare un filter. Utilizzano gli stessi argomenti della query, ma fanno cose diverse.

Rarst Rarst
29 set 2010 23:14:14

Ops! Ho completamente frainteso la domanda! Scusa!

User User
29 set 2010 23:19:14
0
  1. Salva il valore nel database come:

    'enddate'   =>  date('Y-m-d');
    
  2. 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.

5 gen 2015 12:50:59