Daten in meta_query können nicht verglichen werden

7

Dies ist der Code, mit dem ich Ereignisbeiträge erhalte, deren Datumsmetadaten neuer sind als heute:

    <?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()) : ?>

Dies ergab keine Ergebnisse. Das Feld "numericdate" enthält eine Zeichenfolge "ddmmyyyy", daher habe ich erwartet, dass der Vergleich mit einem heutigen Datumswert "dmY" funktioniert. Ich lag falsch. Oder es gibt einen Fehler im obigen Code. Danke für Ihre Hilfe !

Pierre
quelle

Antworten:

6

Ich habe hier genau das gleiche Problem, außer dass ich den Standard benutze. Beitragstyp (Beitrag) und eine Kategorie in meiner Abfrage. Alles funktioniert außer der Sortierreihenfolge.

$d = date("Y-m-d");
$args = array(
    'post_type'         => 'post',
    'category_name'     => 'events',
    'post_status'       => 'publish,draft,pending,future,private', // just for me
    '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' => '>'
        )
    )
);

Trotzdem werden meine Beiträge nach String-Vergleich sortiert. Was habe ich falsch gemacht?

Nun, nach ein wenig Versuch und Irrtum fand ich heraus, dass ich anstelle von 'meta_value_num' 'meta_value' hätte verwenden sollen:

$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' => '>'
        )
    )
);
micha
quelle
Ymd ist das richtige Format - ich habe einige ausprobiert und dadurch die richtigen Ergebnisse erzielt.
Simon Pollard
4

Verwenden Sie für diese Art von Abfragen WordPress current_time () .

current_time('mysql') Gibt dem Server Zeit gemäß den von MySQL akzeptierten Administratoreinstellungen

Eranda Hettiarachchi
quelle
3

Ich glaube, das MySQL-Datumsformat sollte JJJJ-MM-TT sein. Ich denke auch, dass orderby meta_value_num sein sollte, sonst werden die Werte als Strings behandelt.

Milo
quelle
1
In der Tat wird der CAST()Vorgang zurückgegeben, NULLwenn Ihre Daten nicht das richtige Format haben. Es akzeptiert auch YYYYMMDDohne die Trennzeichen, aber nicht DDMMYYYY. Ich weiß nicht über die orderby- würde es die gegossenen Werte der Meta-Abfrage verwenden?
Jan Fabry
Danke Milo, es funktioniert jetzt wie ein Zauber! meta_value_num hat den Job richtig gemacht, ich frage mich, warum niemand so ein Detail in diesem ähnlichen Thread bemerkt hat: bit.ly/l88vup
Pierre
0

Abgesehen von den Datumsformateinstellungen von MySQL gibt es viele gute Gründe, Bigendian-Formate wie Ymd zu verwenden.

Sie würden denken, dass ein Vergleich der Daten offensichtlich wäre, aber ...

05262011> 01012012

und so weiter. Sie werden viele Probleme verursachen, wenn Sie versuchen, das dmY-Format zu verwenden.

Ich denke auch nicht, dass 'Datum' einer der akzeptierten Parameter für meta_query "Typ" ist. Lassen Sie diesen Parameter weg und verwenden Sie den Zeichenfolgenvergleich, um die besten Ergebnisse zu erzielen.

goldene Äpfel
quelle
1
Datum ist gültig, ab WP_Query- Eintrag im Codex: Mögliche Werte sind 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED'. Der Standardwert ist 'CHAR'.
Milo
0

Wenn jemand das gleiche Problem hat, schauen Sie sich besser den Filter posts_clauses an .
Sie können die Abfrage SQL selbst bearbeiten.
Dort können Sie den Wert der Datumsspalte konvertieren und die where-Klausel und die orderby-Klausel ändern.

$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";
Yaron
quelle