web-dev-qa-db-fra.com

Échec de la comparaison des dates dans meta_query

C’est le code que j’utilise pour obtenir les publications d’événement dont les métadonnées de date sont plus récentes qu’aujourd’hui:

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

Cela n'a retourné aucun résultat. Le champ "numericdate" contient une chaîne "ddmmyyyy", donc je m'attendais à ce que la comparaison avec un "dmY" date date fonctionne correctement. J'avais tort. Ou il y a une erreur dans le code ci-dessus. Merci de votre aide !

7
Pierre

J'ai exactement le même problème ici, sauf que j'utilise le std. poste type (post) et une catégorie dans ma requête. tout fonctionne sauf l'ordre de tri.

$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' => '>'
        )
    )
);

Mais mes articles sont néanmoins triés par comparaison de chaînes. Qu'ai-je fait de mal?

Après quelques essais et erreurs, j'ai découvert qu'au lieu de "meta_value_num", j'aurais dû utiliser "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' => '>'
        )
    )
);
6
micha

Pour ce qui est utile, utilisez wordpress current_time () pour ce type de requête.

current_time('mysql') donne au serveur une heure acceptable par MySQL, en fonction des paramètres de l’administrateur.

4

Je crois que le format de date MySQL devrait être AAAA-MM-JJ. De plus, je pense que orderby devrait être meta_value_num, sinon les valeurs sont traitées comme des chaînes.

3
Milo

Si quelqu'un a le même problème, vous feriez mieux de regarder posts_clauses filter.
Il vous permet de manipuler la requête SQL elle-même.
Vous pouvez y convertir la valeur de la colonne de date et modifier les clauses where et 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";
0
Yaron

Mis à part les préférences de MySQL en ce qui concerne le format de date, il existe de nombreuses bonnes raisons d'utiliser des formats bigendiens tels que Y-m-d.

Vous penseriez que comparer les dates serait évident, mais ...

05262011> 01012012

etc. Vous vous causerez beaucoup de problèmes en essayant d'utiliser le format dmY.

De plus, je ne pense pas que "date" soit l'un des paramètres acceptés pour le "type" meta_query. Laissez ce paramètre de côté et utilisez la comparaison de chaînes pour obtenir de meilleurs résultats.

0
goldenapples