it-swarm.com.de

Meta-Vergleich mit Datum (als String gespeichert) funktioniert nicht

Ich habe einen benutzerdefinierten Beitragstyp, der eine Reihe von Meta-Boxen enthält. Eines davon ist ein expiration_date-Feld, das seine Informationen in der Datenbank als eine Zeichenfolge speichert, die wie folgt formatiert ist

Feb 1, 2017

Ich versuche, eine Abfrage zu schreiben, mit der die Elemente mit einem Datum in der Vergangenheit herausgefiltert und nur zukünftige Elemente angezeigt werden. Ich habe mehrere Versionen der folgenden Abfrage ausprobiert und keine funktioniert:

$myquery = array (
'post_type' => $cpt,
    'numberposts'=>-1,
    'meta_key' => 'expiration_date',
    'meta_value' => date('M j, Y'),
    'meta_compare' => '<'
    ),
 );

Die Abfrage gibt alle Beiträge unabhängig vom Datum oder keine Beiträge zurück, wenn ich das Carot umkehre (<)

Ich weiß, dass WP zur Verwendung von Datumsfeldern ein anderes Format erwartet (JJJJ-MM-TT), aber so wurde diese App (von jemand anderem) nicht erstellt, also das Format oben ist, womit ich arbeite.

Die Frage ist also: Gibt es eine Möglichkeit, die Datumszeit vor dem Vergleich zu konvertieren? Wenn ich das Feld in einem Datensatz selbst herausziehe, kann ich es konvertieren (mit strtotime), aber ich versuche natürlich, Werte basierend auf dem Datum vor der Anzeige herauszufiltern, damit ich die richtige Nummer im Satz habe, mit der ich am arbeiten kann Start.

4
Stephen

Haben Sie versucht, meta_query in WP_Query zu verwenden?

$args = array(
    'post_type'  => $cpt,
    'meta_query' => array(
        array(
            'key'     => 'expiration_date',
            'value'   => date('M j, Y'),
            'compare' => '<',
        ),
    ),
);
$query = new WP_Query( $args );

stellen Sie außerdem sicher, dass das Datum in der Postmeta-Tabelle dasselbe Format hat, das Sie als Wert in meta_query übergeben.

1
Aamer Shahzad

Am Ende habe ich das Problem des anfänglichen Datumsformats umgangen, indem ich das Feldformat expiration_date in JJJJ-MM-TT geändert habe (und dann die Anzeige dieses Felds an einer anderen Stelle geändert habe, damit es beim Anzeigen durch Endbenutzer im ursprünglichen Format bleibt). Nun funktioniert eine normale meta_query mit DATETIME:

$myquery = array (
'post_type' => $cpt,
    'numberposts'=>-1,
    'meta_key' => 'expiration_date',
    'type'=> 'DATETIME',
    'meta_value' => date("Y-m-d"),
    'meta_compare' => '<'
    ),
 );

Ich hätte gerne noch eine Antwort auf die obigen Fragen, falls es eine gibt, bei der der Wert vor dem Vergleich sofort konvertiert werden kann. Ich schätze, ich werde es abwarten, meine eigene Antwort zu akzeptieren, um ein bisschen auf diese Antwort zu hoffen.

1
Stephen

Vielleicht könntest du so etwas probieren?

$args2 = array( 
            'post_type'     => $cpt,
            'posts_per_page'=> -1, 
            'meta-key' => 'expiration_date',
            'meta_query' => Array ( 
                                Array ('key' => 'expiration_date', 
                                        'compare' => '>=', 
                                        'value' => date('M j, Y',strtotime('now')), //strtotime for value for now, date() to format the timestamp
                                            'type' => 'DATETIME'
                                            ) 
                                            ),
            'orderby'       =>   'meta_value', 
            'order'         =>   'ASC' //or DESC
            );

Das funktioniert für mich, wenn ich nur Ereignisse bekomme, die noch in der Zukunft liegen.

EDIT: Ich muss mich entschuldigen, das funktioniert NICHT. Ich fuhr zu einem Termin, als mir klar wurde, wo die Sortierung tatsächlich durchgeführt wurde. Ganz unten in meiner Datei befand sich eine if-Anweisung aus meinem vorherigen Versuch, die das Sortieren und Ordnen übernahm. Entfernte diese Zeile und es funktioniert nicht mehr ...

0
Hamsterdrache

Die clevere Lösung wäre, das Feldformat expiration_date für YYYY-MM-DD zu verwenden.

Auf diese Weise können Sie zukünftige WordPress-Meta-Abfragen problemlos erstellen.

Die Konvertierung sollte ein Kinderspiel sein.

0
prosti

Sie können date_parse_from_format verwenden, um das Datumsformat zu konvertieren:

date_parse_from_format('M j, Y', 'Feb 1, 2017');

Dann könnten Sie das Array als Datum ("Y-m-d") umformen.

Die vollständige Array-Struktur lautet:

[year] =>  
[month] => 
[day] =>  
[hour] =>  
[minute] => 
[second] =>
[fraction] =>  
[warning_count] =>  
[warnings] => Array() 
[error_count] => 
[errors] => Array() 
[is_localtime] => 
[zone_type] => 
[zone] => 
[is_dst] =>
0
Mudy S