Cum să utilizez query_posts() cu un filtru de dată pe un câmp personalizat?

29 sept. 2010, 20:57:27
Vizualizări: 15.9K
Voturi: 2

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.

0
Toate răspunsurile la întrebare 4
2

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=>'
));
29 sept. 2010 22:54:48
Comentarii

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

Denis de Bernardy Denis de Bernardy
6 dec. 2010 21:00:16

Da, ai dreptate.

sorich87 sorich87
7 dec. 2010 02:28:21
4

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.

29 sept. 2010 21:11:29
Comentarii

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

jessegavin jessegavin
29 sept. 2010 21:19:36

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.

Rarst Rarst
29 sept. 2010 21:26:59

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.

jessegavin jessegavin
29 sept. 2010 22:24:59

Răspunsul tău a rezolvat principala problemă pe care o aveam. Mulțumesc

jessegavin jessegavin
29 sept. 2010 23:53:31
2

Poate că asta ar funcționa?

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

Codul tău modifică order, în timp ce întrebarea originală se referă la aplicarea unui filter. Ele folosesc aceleași argumente de interogare, dar fac lucruri diferite.

Rarst Rarst
29 sept. 2010 23:14:14

Hopa! Am citit complet greșit întrebarea! Îmi cer scuze!

User User
29 sept. 2010 23:19:14
0
  1. Salvează valoarea în baza de date astfel:

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

5 ian. 2015 12:50:59