web-dev-qa-db-fra.com

Est-il possible d'appliquer une meta_query à un type d'article spécifique dans une requête avec des types d'article multiples?

J'ai deux types de messages, nouvelles et événements :

  • Une news n'a pas de champs personnalisés.
  • Un événement a deux champs personnalisés: start-date et date de fin .

Je souhaite afficher des actualités et des événements , idéalement avec une seule requête.

Un fait important est que les événements doivent être commandés avant le date de fin et que seuls les événements futurs ou actuels doivent être affichés.

Voici la requête que j'essaye:

$args = array(
    'post_type' => array( 'news', 'events' ),
    'meta_key' => 'end-date',
    'orderby' => 'meta_value',
    'order' => 'ASC',
    'meta_query' => array(
        array( 
            'key' => 'end-date',
            'value' => date ( 'Ymd' ),
            'type' => 'NUMERIC',
            'compare' => '>='
        )
    )
);

Cela fonctionne très bien pour les événements seuls, mais pas lorsque j'ajoute des nouvelles aux types de poste.

Le problème semble être que j'ai spécifié les paramètres 'meta_key' et 'meta_query' qui ne sont présents que sur les événements , de sorte que tous les les nouvelles sont omises dans les résultats.

Ma question est donc la suivante: existe-t-il un moyen de cibler un méta_query sur un post_type spécifique dans une même requête?

1
mike23

Vous pouvez ajouter un autre tableau dans votre méta_query pour inclure toutes les publications de votre deuxième type de publication.

Dans votre exemple, vous avez 2 types de message

  1. événements
  2. nouvelles

Si vous pouvez choisir un meta_key qui n'existe que pour news mais n'existe pas sur events, cet ensemble d'arguments renverra tous les types de publication d'articles et continuera à filtrer les événements.

$args = array(
    'post_type' => array( 'news', 'events' ),
    'meta_key'  => 'end-date',
    'orderby'   => 'meta_value',
    'order'     => 'ASC',
    'meta_query' => array(
        array( 
          'key'   => 'end-date',
          'value' => date ( 'Ymd' ),
          'type'  => 'NUMERIC',
          'compare' => '>='
        ),
        array(
          'key'      => 'my_unique_key_for_news',
          'compare'  => 'EXISTS'
        ),
        'relation' => 'OR',
    )
);

Le relation => OR est important. Il est indiqué que les résultats correspondant à votre end-dates correspondant à >= aujourd'hui, OR et tous les éléments correspondant à la clé pour news (ce qui correspond à tous les éléments d'actualité) doivent être renvoyés.

De cette façon, vous obtenez des informations spécifiques sur les méta_valeurs des événements, mais vous renvoyez tous les résultats pour les actualités, ce qui permet au filtre de conserver le type de deuxième message seul.

3
italiansoda