Parametri WP_query pentru interval de date
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.

Copiat de pe StackOverflow:
WP_Query
oferă un parametrudate_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.

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

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

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.

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.

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.

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?

@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 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.

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

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

@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.

@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 =/

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.
