Cum caut evenimente între două date setate în WordPress?

28 nov. 2011, 05:09:09
Vizualizări: 33.5K
Voturi: 4

Construiesc un site WordPress cu o funcționalitate de evenimente. Pagina de evenimente a fost creată folosind tipuri de postări personalizate (custom post types).

Vreau să le ofer utilizatorilor posibilitatea de a căuta/filtra evenimente după date. De exemplu, să poată căuta toate evenimentele care au loc între 2 decembrie 2011 și 1 martie 2012 și să obțină rezultate din evenimentele care au datele între lunile decembrie și martie (adică decembrie, ianuarie, februarie și martie).

Doresc să știu care este cea mai bună modalitate de a realiza acest lucru. Aveți idei?

Puteți vedea un exemplu al funcționalității pe care vreau să o realizez uitându-vă la caracteristica "Search events by date" de pe această pagină http://www.londontown.com/events

Dacă acest lucru nu va fi posibil, există vreo modalitate prin care pot să le permit să caute evenimente care au loc între anumite luni, să zicem decembrie și februarie (excluzând zilele)?

Mulțumesc anticipat.

0
Toate răspunsurile la întrebare 2
2
11

Există două lucruri pe care trebuie să le faci pentru a realiza acest lucru:

1) Crează metadate pentru fiecare eveniment

2) Interoghează articolele folosind meta_query

Pentru #1, trebuie să adaugi o metabox care să permită utilizatorului să adauge o dată pentru eveniment. Aceste date ar trebui stocate ca metadate folosind add_post_meta sau update_post_meta. Îți recomand să citești despre adăugarea metadatelor dacă nu ești familiarizat cu modul de a face acest lucru:

http://codex.wordpress.org/Function_Reference/add_meta_box http://www.wproots.com/complex-meta-boxes-in-wordpress/

Pentru #2, presupunând că ai salvat valorile datei într-un format care poate fi ordonat (de ex., AAAA-LL-ZZ), poți folosi parametrul meta_query într-o nouă instanță a WP_Query pentru a obține intervalul de date dorit. Această metodă presupune că meta_key-ul tău este "_my-datetime-from". De exemplu, poți obține articolele din octombrie și noiembrie 2011 cu următoarele:

// Setează argumentele pentru evenimente
$start = '2011-11-31';
$end = '2011-10-01';
$args = array(
    'post_type' => 'my-event-type',
    'posts_per_page' => -1,
    'orderby' => 'meta_value',
    'order' => 'ASC',
    'meta_key' => '_my-datetime-from',
    'meta_query' => array(
        array(
            'key' => '_my-datetime-from',
            'value' => array($start, $end),
            'compare' => 'BETWEEN',
            'type' => 'DATE'
        )
    )
);
// Realizează interogarea
$events_query = new WP_query();
$events_query->query($args);
28 nov. 2011 05:50:33
Comentarii

Bine. Am înțeles, dar cum pot adăuga acest lucru în formularul de căutare, astfel încât să nu fie nevoie să introduc manual datele în cod. Ar trebui să fie integrat în formularul de căutare, astfel încât utilizatorii să poată obține evenimente selectând date. Mulțumesc.

Sosthenes Kwame Boame Sosthenes Kwame Boame
29 nov. 2011 04:13:44

Cred că sunt aproape. Am acest cod în fișierul search.php acum http://www.pastebin.com/zMRwRihz și acesta este conținutul formularului meu de căutare: http://www.pastebin.com/nZePhPHV Folosesc jquery ui datepicker pentru a selecta datele în interfața (câmpul de căutare după dată). Iată ce obțin în URL după trimiterea căutării: http://localhost/wordpress3/?s=01%2F01%2F2011&ghes_event_start_timestamp=&s=12%‌​2F31%2F2011&ghes_event_end_timestamp=&_wpnonce=4cb83de127 Totuși, nu sunt returnate rezultate. Aveți vreo idee ce împiedică afișarea postărilor? Mulțumesc.

Sosthenes Kwame Boame Sosthenes Kwame Boame
12 dec. 2011 17:47:40
3

Cum stocați data evenimentului: folosind câmpul implicit post_date al postării sau un câmp meta personalizat?

Dacă utilizați câmpul implicit post_date, puteți folosi filtrul posts_where pentru a adăuga condiții de căutare, astfel:

// Creați o nouă funcție de filtrare care va adăuga clauza WHERE la interogare
function filter_where( $where = '' ) {
    // postări între 1 martie și 15 martie 2010
    $where .= " AND post_date >= '2010-03-01' AND post_date < '2010-03-16'";
    return $where;
}

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

Pentru mai multe exemple, vă rugăm să consultați Codex.

În cazul utilizării unui câmp personalizat, presupun că trebuie să scrieți propriile interogări MySQL personalizate. Este un pic mai complicat. Iată un exemplu:

global $wpdb;
$post_ids = $wpdb->get_col( "
    SELECT ID FROM {$wpdb->posts}
    JOIN {$wpdb->postmeta}
    WHERE ID=post_id
    AND meta_key='your_custom_meta_key'
    AND meta_value >= '2010-03-01'
    AND meta_value < '2010-03-16'
" );

foreach ( $post_ids as $post_id ) {
    $post = get_post( $post_id );
    // Faceți ceva
}
wp_reset_postdata();
28 nov. 2011 05:43:14
Comentarii

Nu este nevoie să folosești o interogare personalizată pentru asta. Poți folosi direct "meta_query".

tollmanz tollmanz
28 nov. 2011 05:52:06

@rilwis Cred că sunt aproape. Acum am asta în fișierul search.php http://www.pastebin.com/zMRwRihz și asta în formularul de căutare: http://www.pastebin.com/nZePhPHV Folosesc jquery ui datepicker pentru a selecta datele în interfața (câmpul de căutare după dată). Iată ce obțin în URL după trimiterea căutării: http://localhost/wordpress3/?s=01%2F01%2F2011&ghes_event_start_timestamp=&s=12%‌​2F31%2F2011&ghes_event_end_timestamp=&_wpnonce=4cb83de127 Totuși, nu sunt returnate rezultate. Ai vreo idee ce împiedică afișarea postărilor? Mulțumesc.

Sosthenes Kwame Boame Sosthenes Kwame Boame
12 dec. 2011 17:48:40

ai introdus manual valorile datei. cum le poți face dinamice, în mod sigur?

ahnbizcad ahnbizcad
10 sept. 2015 10:44:30