Eroare la compararea datelor în meta_query - Soluții WordPress
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!
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' => '>'
)
)
);

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

Î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?

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

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

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

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";
