Parametri WP_query pentru interval de date

7 iun. 2013, 21:26:17
Vizualizări: 25.2K
Voturi: 6

Folosesc plugin-ul events manager pentru a crea postări personalizate pentru evenimente. Nu am nevoie de un blog, așa că am modificat fișierul index.php al temei mele (folosind o temă copil) pentru ca interogarea să preia tipul de postare "event" pe pagina principală.

new WP_Query ( array( 'paged' => $paged, 'post_type' => 'event', 'posts_per_page' => 4 ) (Am inclus doar tipul de postare 'event').

Până aici totul e bine. Dar afișează evenimente curente, trecute și viitoare pe pagina principală. Vreau să afișeze doar evenimente curente și viitoare (adică, vreau ca evenimentele care nu au început încă să fie afișate pe pagina principală. Vreau doar să împiedic afișarea evenimentelor trecute). Am consultat pagina codex pentru WP_Query și am folosit următorul fragment de cod:

// Creează o nouă funcție de filtrare care va adăuga clauza where la interogare
function filter_where( $where = '' ) {
    // postări pentru perioada 1-15 martie 2010
    $where .= " AND post_date <  CURDATE() ";
    return $where;
}

add_filter( 'posts_where', 'filter_where' );
$query = new WP_Query( $query_string );
remove_filter( 'posts_where', 'filter_where' )

Nu produce rezultatul dorit deoarece data evenimentului nu este stocată în post_date în baza de date.

Totuși, presupun că există o modalitate simplă de a face referire la datele evenimentelor, deoarece data afișată automat pe pagina principală nu este data publicării postărilor, ci mai degrabă data de început a evenimentului, fără a fi făcută vreo modificare.

2
Comentarii

probabil este stocat în meta datele postării, folosește get_post_custom pentru a vedea toate metadatele asociate unui eveniment și o interogare meta pentru a interoga în funcție de cheia datei.

Milo Milo
7 iun. 2013 21:35:38

@Milo da, este, dar nu știu cum să o analizez. Iată rezultatul: http://pastebin.com/3er1WBMv

That Brazilian Guy That Brazilian Guy
8 iun. 2013 21:38:03
Toate răspunsurile la întrebare 2
2
12

Copiat de pe StackOverflow:

WP_Query oferă un parametru date_query, care îți permite să setezi un interval cu before (înainte) și after (după).

https://developer.wordpress.org/reference/classes/wp_query/#date-parameters

$args = array(
    'date_query' => array(
        array(
            'after'     => '1 ianuarie 2015',
            'before'    => '31 decembrie 2015',
            'inclusive' => true,
        ),
    ),
);
$query = new WP_Query( $args );

Consultă documentația linkată pentru mai multe detalii.

Reține că celălalt răspuns, care folosește o interogare postmeta, este depășit, nimeni nu ar mai trebui să facă asta acum că WP_Query suportă aceste interogări de date.

23 apr. 2019 22:34:38
Comentarii

Poți să adaugi te rog versiunea WP în care a fost adăugat acest suport?

That Brazilian Guy That Brazilian Guy
23 apr. 2019 23:43:49

Cum scrie în articolul Codex pe care l-am linkuit date_query (array) - Parametri de dată (disponibil începând cu Versiunea 3.7). deci este foarte vechi la acest punct, cu siguranță sigur de utilizat :)

jerclarke jerclarke
23 apr. 2019 23:59:08
15

Se pare că ai nevoie de un meta_query.

$query = new WP_Query ( 
  array( 
    'paged' => $paged, 
    'post_type' => 'event', 
    'posts_per_page' => 4,
    'meta_query' => array(
      array(
        'key' => 'date_key_name',
        'value' => date('Y-m-d'),
        'compare' => '>=',
      )
    )
  )
);

Fii atent că datele tale trebuie să fie într-un format pe care îl poate analiza corect o mașină.

Referință

http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters

7 iun. 2013 21:42:00
Comentarii

câmpul personalizat este stocat în formatul AAAA-LL-ZZ. Am încercat compararea folosind meta_key + meta_value, meta_query + key + value, operatori '=' și 'LIKE'. Nimic nu pare să funcționeze. Nici măcar prin introducerea datei evenimentului în mod literal.

That Brazilian Guy That Brazilian Guy
8 iun. 2013 08:08:19

Ai încercat codul pe care l-am postat?

s_ha_dum s_ha_dum
8 iun. 2013 15:18:32

Ei bine, nu, pentru că codul tău se așteaptă ca datele să fie în timp Unix, am presupus (incorect?). O să încerc acum.

That Brazilian Guy That Brazilian Guy
8 iun. 2013 21:39:23

YYYY-MM-DD, cu sau fără separatori, se va sorta numeric. Este singurul format de dată uman care se sortează numeric în același mod în care se sortează pe un calendar. Eu tind să prefer UNIXTIME, sau coloane de tip DATE/DATETIME, dar cred că acest format ar trebui să funcționeze.

s_ha_dum s_ha_dum
8 iun. 2013 21:44:14

Ce pun ca valori pentru $date1 și $date2? Trebuie să verific dacă data de încheiere a evenimentului a trecut deja, așa că trebuie să compar data de astăzi cu data de încheiere a evenimentului, dar cum obțin data de încheiere a evenimentului ca să o setez ca una dintre variabile?

That Brazilian Guy That Brazilian Guy
8 iun. 2013 22:25:33

@ruda.almeida vrei o relație de tip OR cu cheile de început și sfârșit - fie data de început este egală sau mai mare decât data de astăzi, fie data de sfârșit este egală sau mai mare decât data de astăzi.

Milo Milo
8 iun. 2013 22:33:49

@Milo nu, vreau ca evenimentele care nu au început încă să fie afișate și pe pagina principală. Vreau doar să împiedic afișarea evenimentelor trecute.

That Brazilian Guy That Brazilian Guy
8 iun. 2013 22:36:05

@ruda.almeida da, asta am spus - fie data de început este în viitor, FIER data de sfârșit este în viitor.

Milo Milo
8 iun. 2013 22:52:45

@ruda.almeida : vezi editarea. Nu pot acum

s_ha_dum s_ha_dum
8 iun. 2013 22:59:10

@Milo dacă data de încheiere este în viitor, presupun că pot ignora data de început.

That Brazilian Guy That Brazilian Guy
8 iun. 2013 23:05:08

@ruda.almeida aha, e adevărat, nu mă gândisem la asta! deși dacă vrei să ordonezi după data de început, acea cheie trebuie să facă parte din interogare.

Milo Milo
8 iun. 2013 23:07:36

@Milo aha, e adevărat, nu mă gândisem la asta! ;-)

That Brazilian Guy That Brazilian Guy
8 iun. 2013 23:12:56

@s_ha_dum Această modificare este codul pe care l-am încercat eu când am citit codex-ul despre meta_query. Nu a funcționat atunci, am copiat codul tău (schimbând "date_key_name" cu "event_end_date", evident, numele câmpului personalizat). Nu a funcționat. Cred că fac ceva greșit =/

That Brazilian Guy That Brazilian Guy
8 iun. 2013 23:14:26

Numele câmpului în baza de date este "_event_end_date", am crezut că trebuie să elimin primul "_" dar funcționează dacă îl păstrez.

That Brazilian Guy That Brazilian Guy
8 iun. 2013 23:17:16

Acel underscore inițial previne afișarea câmpurilor în caseta dropdown "Meta Personalizată".

s_ha_dum s_ha_dum
9 iun. 2013 01:44:58
Arată celelalte 10 comentarii