Querying custom post type with 2 custom fields (date-range)

11 set 2011, 21:06:21
Visualizzazioni: 3.88K
Voti: 4

Ho cercato nel WP Codex e su StackExchange e ho ottenuto alcuni indizi, ma non riesco a far funzionare questa query. Ho 2 campi personalizzati associati a ogni mostra nel formato Y-m-d: exstart-date rappresenta la data di inizio della mostra e exend-date la data di fine.

Riesco facilmente a visualizzare le mostre future e quelle passate, ma non riesco a impostare correttamente la meta_query per mostrare le mostre correnti (con una data di inizio minore o uguale a oggi E una data di fine maggiore o uguale a oggi). Il codice seguente non mostra nulla nella pagina. Aiuto?

$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',
            'value' => $today,
            'compare' => '<=',
            'type' => 'CHAR'
            ),
        array(
            'key' => 'exend-date',
            'value' => $today,
            'compare' => '>=',
            'type' => 'CHAR'
            )
        )
    ));
if (have_posts()) :
while (have_posts()) : the_post();
11
Commenti

una cosa che salta immediatamente all'occhio è 'type' => 'CHAR', dovrebbe essere 'type' => 'DATE', no?

Milo Milo
11 set 2011 23:20:49

Ho provato a usare DATE e ancora non funzionava. Quando faccio la query solo per la data di inizio o solo per la data di fine, CHAR funziona bene.

Ray Gulick Ray Gulick
12 set 2011 01:50:12

l'unica altra cosa è che caller_get_posts è un parametro vero/falso, ma è stato sostituito con ignore_sticky_posts, anche se questo non dovrebbe influenzare la query, ottieni solo un avviso di deprecazione. L'ho provato qui e sembra funzionare, forse verifica che nient'altro stia interferendo con la query, come un plugin, print_r($wp_query) e controlla il contenuto.

Milo Milo
12 set 2011 02:45:12

Grazie, ma la stampa della query non ha rivelato nulla. C'è qualcosa che non va con il meta_query relazionale. Se interrogo exstart_date o exend_date singolarmente, nessun problema; ottengo il risultato corretto. Ma la query combinata non restituisce nulla.

Ray Gulick Ray Gulick
12 set 2011 15:01:23

se c'è qualcosa che non va nella query, lo vedresti nel SQL generato quando ispezioni $wp_query. funziona così com'è per me quando copio/incollo il tuo codice e aggiungo i campi meta appropriati (sto anche cambiando il post_type con uno che ho già configurato). i tuoi campi meta date sono nel formato yyyy-mm-dd? Non credo che le altre query che stai facendo funzionerebbero se non lo fossero.

Milo Milo
12 set 2011 15:18:54

Sì: yyyy-mm-dd Forse ho implementato male la stampa della query. Ripeto, le query funzionano separatamente, ma non in tandem.

Ray Gulick Ray Gulick
12 set 2011 19:42:02

Non dovrebbe essere il valore di confronto '=', visto che stai cercando di verificare che entrambi contengano la data odierna?

Michelle Michelle
12 set 2011 19:53:59

Non contengono la data odierna. Stiamo cercando valori uguali o maggiori della data di inizio e uguali o minori della data di fine. Ho anche provato questa query rimuovendo l' '=', in modo che cerchi valori compresi tra le date di inizio e fine, ma nemmeno così ho ottenuto un risultato. A meno che non stia completamente fraintendendo la logica, il che è possibile.

Ray Gulick Ray Gulick
12 set 2011 20:00:15

La parte che ci interessa è $wp_query->request, questo ci darà la query SQL effettiva che viene inviata al database. Se hai phpMyAdmin, come controllo di verifica, puoi incollare direttamente quella query nella scheda SQL per vedere cosa restituisce. Ecco come appare la mia. A parte il post_type, la tua dovrebbe apparire uguale, a meno che qualcos'altro, come un plugin, non stia filtrando la query.

Milo Milo
12 set 2011 21:18:14

Non ho accesso a phpMyAdmin su questo sito specifico.

Ray Gulick Ray Gulick
13 set 2011 01:59:10

Ho notato che hai usato la stessa data come data di inizio e fine. Hai provato quando le due date erano diverse?

Ray Gulick Ray Gulick
16 set 2011 15:58:22
Mostra i restanti 6 commenti
Tutte le risposte alla domanda 1
0

Ecco il codice con cui ho finito per ottenere il risultato desiderato. Avrei dovuto specificare che la query era all'interno del loop, perché quando l'ho mostrato a Damian Taggart di Mindshare Studios, ha notato che avrei dovuto usare WP_Query invece di query_posts. Ringrazio Milo e gli altri per aver tentato di aiutarmi nonostante non avessero tutte le informazioni necessarie.

<?php
     $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
     $today = date('Y-m-d', strtotime('-6 ore'));
     $myquery = new WP_Query(array(
     'post_type' => 'mostre', 
     'posts_per_page' => 6,  
     'paged' => $paged,
     'orderby' => 'title',
     'order' => 'ASC',
     'meta_query'=>array(
            'relation'=>'AND',
            array(
                'key' => 'data-inizio',
                'value' => $today,
                'compare' => '<=',
                'type' => 'CHAR'
            ),
            array(
                'key' => 'data-fine',
                'value' => $today,
                'compare' => '>=',
                'type' => 'CHAR'
            )
        )
    ));
    if ($myquery->have_posts()) :
    while ($myquery->have_posts()) : $myquery->the_post();
?>
19 set 2011 22:33:22