web-dev-qa-db-fra.com

Utilisez méta_query pour afficher les événements par date dans un champ personnalisé

Je travaille sur un modèle pour une archive de catégorie spécifique de l'événement de type publication personnalisé.

J'ai besoin de faire une requête qui montre les événements futurs et en cours, en classant par date dans un champ personnalisé.

$termName = get_queried_object()->name;
$termSlug = get_queried_object()->slug;
$event1 = current_time('Y-m-d');

$args = array(
    'post_type' => 'event',
    'event-categories' => $termSlug,
    'post_status' => 'publish',
    'posts_per_page' => 10,
    'order' => 'ASC',
    'meta_query' => array(
        'relation'    => 'OR',
        array(
            'relation'    => 'AND',

        array(

            'key' => '_event_start_date',
            'value' => $event1,
            'compare' => '>=',
            'type' => 'DATE',

        ),


        array(

            'key' => '_event_end_date',
            'value' => $event1,
            'compare' => '>=',
            'type' => 'DATE',

        )
        ),
        array(
            'key' =>  $event1,
            'value' => array('_event_start_date','_event_start_date'),
            'type' => 'DATE',
            'compare' => 'BETWEEN'
        )

    ),

     'orderby' => '_event_start_date',
 );
$events = new WP_Query($args);
echo $events->post_count   ;

Le résultat ne montre que les événements futurs, mais pas les événements en cours.

Qu'est-ce qui ne va pas?

2
Filippo Tah

CODE plus simple:

Logiquement, lorsque vous cochez >= pour _event_start_date et _event_end_date, cela couvre automatiquement la vérification BETWEEN.

Donc, le code suivant devrait fonctionner:

$termName = get_queried_object()->name;
$termSlug = get_queried_object()->slug;
$event1 = current_time( 'Y-m-d' );

$args = array(
    'post_type'        => 'event',
    'event-categories' => $termSlug,
    'post_status'      => 'publish',
    'posts_per_page'   => 10,
    'order'            => 'ASC',
    'meta_query' => array(
        'relation'    => 'OR',
        array(
            'key'     => '_event_start_date',
            'value'   => $event1,
            'compare' => '>=',
            'type'    => 'DATE',
        ),
        array(
            'key'     => '_event_end_date',
            'value'   => $event1,
            'compare' => '>=',
            'type'    => 'DATE',
        )
    ),
    'orderby' => '_event_start_date',
);
$events = new WP_Query( $args );
echo $events->post_count;

Date check:

Assurez-vous également que la valeur de date $event1 est correctement définie comme celle stockée dans la base de données (dans la table méta post). Normalement, WordPress considère en interne que toutes les date sont dans le fuseau horaire GMT. Toutefois, cela peut varier en fonction de la manière dont le _event_start_date et le _event_end_date sont enregistrés dans votre cas. Il peut être différent en fonction de la valeur stockée:

// MySQL DATETIME field format
$event1 = current_time( 'mysql' );

// MySQL DATETIME field format in GMT
$event1 = current_time( 'mysql', 1 );

// Unix timestamp in local time zone
$event1 = current_time( 'timestamp' );

// Unix timestamp in GMT
$event1 = current_time( 'timestamp', 1 );

Alors, mieux vaut vérifier comment ces données sont sauvegardées, ou tester avec ces variances. Si les champs date incluent également l'heure, vous pouvez également utiliser le type DATETIME.

En outre, une note de codex :

Le 'type' DATE fonctionne avec la valeur de comparaison 'BETWEEN' uniquement si la date est enregistrée au format YYYY-MM-DD et testée avec ce format.

tax Requête:

L'ancienne requête tax est obsolète. Donc au lieu d'utiliser:

'event-categories' => $termSlug,

utilisation:

'tax_query' => array(
    array(
        'taxonomy' => 'event-categories',
        'field'    => 'slug',
        'terms'    => $termSlug,
    ),
),
1
Fayaz