web-dev-qa-db-fra.com

Requête personnalisée basée sur une clé méta - Réduire les trois états sur deux?

$args = array(  'post_type' => 'bars',
                'posts_per_page' => -1
                'orderby' => array( 'meta_value' => 'DESC', 'title' => 'ASC' ),
                'meta_query'  => array(
                     'relation' => 'OR',
                        array(
                          'key'     => 'featured_venue',
                          'compare' => 'NOT EXISTS',
                          ),

                        array(
                          'relation' => 'OR',
                                array(
                                  'key'   => 'featured_venue',
                                  'value' => true,
                                ),
                                array(
                                  'key'     => 'featured_venue',
                                  'value'   => 0,
                                ),
                        ),
                  ),

);

$query = new WP_Query($args);

J'ai la requête ci-dessus en place pour le type de message nommé bars. La barre CPT utilise ACF pour créer une barre en utilisant la case à cocher Vrai/Faux d’ACF ( https://www.advancedcustomfields.com/resources/true-false/ ) - ACF est en train de créer la méta clé sélectionnée_venue. Toutefois, depuis que le champ ACF a été ajouté aux publications existantes, la clé méta n’est pas présente dans toutes les publications. J'ai donc les états suivants:

  1. Publier avec Featured_venue = Vrai (1)
  2. Publier avec Featured_venue = false (0)
  3. Poster avec la méta-clé sélectionnée_venue non existante

Mon objectif est de répertorier tous les sites et d’avoir d'abord présenté les sites, puis tous les autres par ordre alphabétique. Cependant, ma requête me donne actuellement le résultat suivant:

  1. Sites présentés par ordre alphabétique
  2. Messages avec Featured_venue metakey = false par ordre alphabétique
  3. Messages sans métakey Venue en vedette par ordre alphabétique.

J'ai essayé de changer les valeurs de comparaison, mais je n'ai pas pu obtenir les résultats souhaités. Au lieu de cela, il laissait toujours tomber les publications avec meta_key, ou celles sans.

Est-il possible de modifier la requête de la manière souhaitée ou dois-je ajouter en bloc la clé méta Feature_venue à toutes les publications?

1
Daniel Klose

Cela peut être fait en fournissant une valeur "par défaut" à l'instruction ORDER BY.

Essayez d'ajouter ceci avant votre appel new WP_Query($args);:

$setDefaultOrderby = function($statement) {
    return str_replace('wp_postmeta.meta_value', "COALESCE(wp_postmeta.meta_value, 'false')", $statement);
};

add_filter('posts_orderby', $setDefaultOrderby);

et cela après:

remove_filter('posts_orderby', $setDefaultOrderby);

Changez le 'false' avec la valeur par défaut dont vous avez besoin.

J'utilise COALESCE ici, qui sélectionne en gros un premier argument que vous lui transmettez, qui n'est pas NULL, ce qui vous permet essentiellement de fournir une solution de secours pour une publication sans clé méta.

1
OriginalEXE