Cum să interoghezi un tip de postare personalizat cu 2 câmpuri personalizate (interval de date)

11 sept. 2011, 21:06:21
Vizualizări: 3.88K
Voturi: 4

Am căutat în WP Codex și StackExchange și am obținut câteva indicii, dar nu reușesc să fac această interogare să funcționeze. Am 2 câmpuri personalizate asociate fiecărei expoziții în format Y-m-d: exstart-data fiind data de început a expoziției și exend-data fiind data de încheiere.

Pot afișa cu ușurință expozițiile viitoare și cele trecute, dar nu reușesc să configurez corect meta_query pentru a afișa expozițiile curente (cu o dată de început mai mică sau egală cu ziua de astăzi ȘI dată de încheiere mai mare sau egală cu ziua de astăzi). Codul de mai jos nu afișează nimic pe pagină. Ajutor?

$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$today = date('Y-m-d', strtotime('-6 hours'));
query_posts(array(
    'post_type' => 'exhibitions', 
    'posts_per_page' => 6, 
    'paged' => $paged,
    'orderby' => 'title',
    'order' => 'DESC',
    'meta_query'=>array(
        'relation'=>'AND',
        array(
            'key' => 'exstart-date',    // Cheia pentru data de început
            'value' => $today,
            'compare' => '<=',          // Mai mic sau egal cu
            'type' => 'CHAR'            // Tipul câmpului
            ),
        array(
            'key' => 'exend-date',     // Cheia pentru data de sfârșit
            'value' => $today,
            'compare' => '>=',          // Mai mare sau egal cu
            'type' => 'CHAR'            // Tipul câmpului
            )
        )
    ));
if (have_posts()) :
while (have_posts()) : the_post();
11
Comentarii

un lucru care sare imediat în evidență este 'type' => 'CHAR', ar trebui să fie 'type' => 'DATE', nu?

Milo Milo
11 sept. 2011 23:20:49

Am încercat să folosesc DATE și tot nu a funcționat. Când fac interogarea doar pentru data de început sau doar pentru data de sfârșit, CHAR funcționează bine.

Ray Gulick Ray Gulick
12 sept. 2011 01:50:12

singurul alt lucru este că caller_get_posts este un parametru true/false, dar a fost înlocuit cu ignore_sticky_posts, deși asta nu ar trebui să afecteze interogarea, doar primești o notificare de depreciere. Am încercat aici și pare să funcționeze, poate verifici dacă nu interferează altceva cu interogarea, cum ar fi un plugin, print_r($wp_query) și inspectează conținutul.

Milo Milo
12 sept. 2011 02:45:12

Mulțumesc, dar interogarea de tip print nu a arătat nimic. Ceva nu merge bine cu meta_query-ul relational. Dacă interoghez exstart_date sau exend_date separat, nu am nicio problemă; obțin rezultatul corect. Dar interogarea combinată nu returnează nimic.

Ray Gulick Ray Gulick
12 sept. 2011 15:01:23

dacă ceva nu merge bine cu interogarea, ai putea vedea asta în SQL-ul generat când inspectezi $wp_query. funcționează așa cum este pentru mine când doar copiez/lipeesc codul tău și adaug câmpurile meta corespunzătoare (de asemenea, schimb post_type-ul cu unul pe care îl am deja configurat). sunt datele din câmpurile meta formatate yyyy-mm-dd? Nu cred că celelalte interogări pe care le faci ar funcționa dacă nu ar fi așa.

Milo Milo
12 sept. 2011 15:18:54

Da: yyyy-mm-dd Poate am implementat greșit interogarea de tip print. Din nou, interogările funcționează separat, dar nu în tandem.

Ray Gulick Ray Gulick
12 sept. 2011 19:42:02

Nu ar trebui să fie valoarea de comparare '=', deoarece încerci să verifici dacă ambele conțin data de astăzi?

Michelle Michelle
12 sept. 2011 19:53:59

Ele nu conțin data de astăzi. Căutăm valori egale sau mai mari decât data de început și egale sau mai mici decât data de sfârșit. Am încercat și această interogare eliminând '=', astfel încât să caute valori între datele de început și sfârșit, dar nici asta nu a returnat un rezultat. Dacă nu înțeleg complet logica, ceea ce este posibil.

Ray Gulick Ray Gulick
12 sept. 2011 20:00:15

Partea care ne interesează este $wp_query->request, aceasta vă va oferi interogarea SQL reală care este trimisă către baza de date. Dacă aveți phpMyAdmin, ca verificare, puteți lipi acea interogare direct în fila SQL pentru a vedea ce returnează. Așa arată a mea. În afară de post_type, a voastră ar trebui să arate la fel, cu excepția cazului în care altceva, cum ar fi un plugin, filtrează interogarea.

Milo Milo
12 sept. 2011 21:18:14

Nu am acces la phpMyAdmin pe acest site anume.

Ray Gulick Ray Gulick
13 sept. 2011 01:59:10

Am observat că ai folosit aceeași dată atât pentru început cât și pentru sfârșit. Ai încercat când cele două date erau diferite?

Ray Gulick Ray Gulick
16 sept. 2011 15:58:22
Arată celelalte 6 comentarii
Toate răspunsurile la întrebare 1
0

Iată codul cu care am rămas și care funcționează. Trebuia să menționez că interogarea era în interiorul buclei, pentru că atunci când i l-am arătat lui Damian Taggart de la Mindshare Studios, el a observat și a spus că ar trebui să folosesc WP_Query în loc de query_posts. Mulțumesc lui Milo și altora care au încercat să mă ajute fără a avea toate informațiile necesare.

<?php
     $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
     $today = date('Y-m-d', strtotime('-6 hours'));
     $myquery = new WP_Query(array(
     'post_type' => 'exhibitions', // tipul postării
     'posts_per_page' => 6,  // numărul de postări pe pagină
     'paged' => $paged, // paginare
     'orderby' => 'title', // ordonare după titlu
     'order' => 'ASC', // ordine crescătoare
     'meta_query'=>array( // interogare meta
            'relation'=>'AND', // relație între condiții
            array(
                'key' => 'exstart-date', // cheie pentru data de început
                'value' => $today, // valoare comparată
                'compare' => '<=', // operator de comparare
                'type' => 'CHAR' // tipul datelor
            ),
            array(
                'key' => 'exend-date', // cheie pentru data de sfârșit
                'value' => $today, // valoare comparată
                'compare' => '>=', // operator de comparare
                'type' => 'CHAR' // tipul datelor
            )
        )
    ));
    if ($myquery->have_posts()) : // verifică dacă există postări
    while ($myquery->have_posts()) : $myquery->the_post(); // începe bucla
?>
19 sept. 2011 22:33:22