Eroare la compararea datelor în meta_query - Soluții WordPress

26 mai 2011, 12:21:10
Vizualizări: 14.7K
Voturi: 8

Acesta este fragmentul de cod pe care îl folosesc pentru a obține postările de tip eveniment a căror dată din metadate este mai recentă decât ziua de astăzi:

    <?php
        query_posts( array(
        'post_type' => 'concerts',
        'meta_key' => 'numericdate',
        'posts_per_page' => -1,
        'orderby' => 'meta_value',
        'order' => 'ASC',
        'meta_query' => array(
            array(
                'key' => 'numericdate',
                'value' => date('dmY'),
                'compare' => '>=',
                'type' => 'date'
                 )
           )
    ) );
    if (have_posts()) : ?>

Aceasta nu a returnat niciun rezultat. Câmpul "numericdate" conține un șir în format "ddmmyyyy", așa că m-am așteptat ca compararea cu valoarea datei de astăzi în format "dmY" să funcționeze. M-am înșelat. Sau există vreo greșeală în codul de mai sus. Mulțumesc pentru ajutor!

0
Toate răspunsurile la întrebare 5
1

Am exact aceeași problemă aici, cu excepția faptului că folosesc tipul standard de postare (post) și o categorie în interogarea mea. Totul funcționează, cu excepția ordinii de sortare.

$d = date("Y-m-d");
$args = array(
    'post_type'         => 'post',
    'category_name'     => 'events',
    'post_status'       => 'publish,draft,pending,future,private', // doar pentru mine
    'meta_key'          => 'event_start',
    'orderby'           => 'meta_value_num',
    'order'             => 'ASC',
    'posts_per_page'    => -1,
    'meta_query'        => array(
        array(
            'key' => 'event_start',
            'value' => $d,
            'type' => 'date',
            'compare' => '>'
        )
    )
);

Dar postările mele sunt sortate prin comparare de șiruri de caractere oricum. Ce am greșit?

Ei bine, după câteva încercări și erori, am descoperit că în loc de 'meta_value_num' ar fi trebuit să folosesc 'meta_value':

$d = date("Y-m-d");
$args = array(
    'post_type'             => 'post',
    'category_name'     => 'events',
    'post_status'           => 'publish,draft,pending,future,private',
    'meta_key'              => 'event_start',
    'orderby'               => 'meta_value',
    'order'                     => 'ASC',
    'posts_per_page'        => -1,
    'meta_query'            => array(
        array(
            'key' => 'event_start',
            'value' => $d,
            'type' => 'date',
            'compare' => '>'
        )
    )
);
8 sept. 2011 11:44:51
Comentarii

Y-m-d este formatul corect - am încercat câteva și acesta mi-a oferit rezultatele corecte.

Simon Pollard Simon Pollard
11 ian. 2016 13:47:27
0

Pentru ceea ce merită, folosește funcția WordPress current_time() pentru acest tip de interogări.

current_time('mysql') returnează ora serverului conform setărilor administratorului, care este acceptată de MySQL

2 aug. 2013 02:17:16
2

Cred că formatul de dată în MySQL ar trebui să fie AAAA-LL-ZZ. De asemenea, consider că orderby ar trebui să fie meta_value_num, altfel valorile sunt tratate ca șiruri de caractere.

27 mai 2011 03:08:55
Comentarii

Într-adevăr, operația CAST() va returna NULL dacă datele tale nu sunt în formatul corect. De asemenea, acceptă YYYYMMDD fără separatori, dar nu și DDMMYYYY. Nu știu despre orderby - ar folosi valorile convertite din interogarea meta?

Jan Fabry Jan Fabry
27 mai 2011 16:44:40

Mulțumesc Milo, acum funcționează perfect! meta_value_num a făcut treaba corect, mă întreb de ce nimeni nu a observat un astfel de detaliu în acest fir similar: http://bit.ly/l88vup

Pierre Pierre
28 mai 2011 14:57:33
1

În afară de preferințele de formatare a datelor în MySQL, există multe motive bune pentru a folosi formatele bigendian precum Y-m-d.

Ai putea crede că compararea datelor este evidentă, dar...

05262011 > 01012012

și așa mai departe. Îți vei crea multe probleme încercând să folosești formatul dmY.

De asemenea, nu cred că 'date' este unul dintre parametrii acceptați pentru "type" în meta_query. Lasă acel parametru necompletat și folosește comparația de șiruri de caractere pentru cele mai bune rezultate.

27 mai 2011 04:23:20
Comentarii

data este validă, din intrarea WP_Query în codex: Valori posibile sunt 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED'. Valoarea implicită este 'CHAR'.

Milo Milo
27 mai 2011 04:26:14
0

Dacă cineva întâmpină aceeași problemă, este recomandat să se uite la filtrul posts_clauses.
Acesta vă permite să manipulați direct SQL-ul interogării.
Acolo puteți converti valoarea coloanei de dată și să modificați clauza WHERE și clauza ORDERBY.

$pieces['where'] .= " AND STR_TO_DATE(wp_postmeta.meta_value,'%d%m%Y' ) >= 
  CURRENT_DATE() ";

$pieces['orderby'] = "STR_TO_DATE( wp_postmeta.meta_value,'%d%m%Y' ) DESC";
11 iul. 2017 17:45:26