Cum să utilizez query_posts() cu un filtru de dată pe un câmp personalizat?
Am definit un tip de postare personalizată care folosește un câmp meta pentru a stoca datele.
În functions.php am următorul cod care salvează data de început. Formatul datei care este trimisă în parametrul formularului startdate
este 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"]);
}
Încerc să afișez o listă cu toate evenimentele care au startdate
mai mare decât ora curentă.
query_posts(array(
'post_type' => array('seminar'),
'meta_key=startdate',
'meta_value='.date("Y/m/d h:i A"),
'meta_compare=>'
));
Aceasta afișează toate evenimentele indiferent de data lor de început. Ce fac greșit?
REZOLVAT:
Din nu știu ce motiv, după ce am schimbat codul în următoarea variantă, a funcționat.
$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);
Am decis să selectez răspunsul de la @Rarst ca fiind cel acceptat, pentru că cred că aveam mai multe probleme de rezolvat, dar răspunsul lui a abordat cel mai bine problema din titlu.
@sorich87 a avut dreptate că ar fi trebuit să stochez datele ca timestamp, dar în final, @Rarst a avut dreptate că dacă specific un argument de format pentru funcția date()
care să se potrivească cu formatul folosit la stocarea datelor în baza de date, atunci ar trebui să pot compara datele.
Mulțumesc pentru ajutor.

Voi converti data într-un timestamp înainte de a o stoca:
add_action('save_post', 'save_details');
function save_details(){
global $post;
update_post_meta($post->ID, "startdate", strtotime($_POST["startdate"]));
}
Și voi folosi timestamp-ul curent pentru a face comparația:
query_posts(array(
'post_type' => array('seminar'),
'meta_key=startdate',
'meta_value='.time(),
'meta_compare=>'
));

Din păcate, asta nu este suficient. Sortarea alfanumerică va aranja numerele ca 1,11,2 în loc de 1,2,11. :-) Cred că este nevoie de un câmp suplimentar. http://wordpress.stackexchange.com/questions/4852/post-meta-vs-seperate-database-tables/4866#4866

Stocați data ca șir formatat, dar funcția time()
pe care o utilizați pentru comparație returnează un timestamp numeric. Astfel, încercați să faceți o comparație între două formate complet diferite și este puțin probabil ca WordPress să fie suficient de inteligent pentru a înțelege acest lucru.

Există vreo modalitate de a stoca data ca Date? Am crezut că singura metodă de a stoca metadate personalizate este ca șir de caractere.

Ei bine, nu există nicio regulă care să interzică salvarea timestamp-ului ca șir de caractere. :) Aș încerca mai întâi să înlocuiesc time()
cu date()
în același format ca și câmpul tău meta. Cred că ar trebui să funcționeze astfel.

Am încercat să înlocuiesc cu date("Y/m/d h:i A"). Nu pare să facă vreo diferență, deși cred că ar fi trebuit.

Salvează valoarea în baza de date astfel:
'enddate' => date('Y-m-d');
Generează meta query astfel:
A. Condiția:
$conArr[0] = array
(
'key'=> 'enddate',
'value' => date('Y-m-d'),
'compare' => '>=',
);
B. Interogarea:
$args = array(
'meta_query'=>$conArr ,
'post_type'=>'tournament',
'orderby' => 'meta_value_num',
)
Important 'orderby' => 'meta_value_num',
și formatul datei sunt importante.
