Fondamentalement meta_query, paramètre de WP_Query vous permet de rechercher des posts WordPress par leurs méta données et de trier le résultat.

Dans ce billet, je suppose que vous avez déjà des connaissances de base sur la façon de travailler avec la classe WP_Query dans WordPress. Avant de commencer, j’aimerais vous montrer quelques exemples très simples. Les exemples similaires que vous pouvez trouver dans WordPress Codex.

Comme vous le savez, tous les posts ont des métadonnées que vous pouvez remplir dans le metabox “Champs personnalisés” (le metabox peut d’ailleurs être caché). Ainsi, par exemple, si vous voulez obtenir un post avec la meta key show_on_homepage et la meta value on, vous pouvez le faire de la manière suivante :

$rd_args = array(
	'meta_key' => 'show_on_homepage',
	'meta_value' => 'on'
);
 
$rd_query = new WP_Query( $rd_args );

Si vous avez plutôt besoin de récupérer tous les posts sauf ceux avec cette paire de méta-clés et de valeurs, vous pouvez utiliser les paramètres suivants :

$rd_args = array(
	'meta_key' => 'show_on_homepage',
	'meta_value' => 'on',
	'meta_compare' => '!='
);
 
$rd_query = new WP_Query( $rd_args );

N’oubliez pas que tous les exemples de ce billet sont simplifiés, certains paramètres WP_Query sont donc manquants, par exemple posts_per_page ou post_type.

Si vous êtes intéressé par d’autres valeurs de paramètres meta_compare, veuillez consulter la description des paramètres “compare” ci-dessous, car les deux acceptent les mêmes valeurs.

C’était des exemples très très simples, juste une introduction. Mais ce post concerne le paramètre meta_query. Ce paramètre nous permet de créer des filtres de posts et des scripts de recherche vraiment cool.

Comment récupérer les posts par meta_value dans WordPress ?

L’exemple simple ci-dessous vous permet d’obtenir tous les posts avec une valeur de champ personnalisé spécifique. Récupérons juste tous les posts avec le nom du champ personnalisé color et la valeur du champ personnalisé en white.

// the meta_key 'color' with the meta_value 'white'
$rd_args = array(
	'meta_query' => array(
		array(
			'key' => 'color',
			'value' => 'white'
		)
	)
);
 
$rd_query = new WP_Query( $rd_args );

Si vous regardez la page d’édition de posts (dans la zone d’administration) dans un post qui correspond à la requête, vous verrez ce qui suit dans la section “Champs personnalisés” :

les meta_query, ou comment obtenir et ordonner des posts par méta-valeurs

Faisons l’inverse – obtenons tous les posts sauf ceux qui ont la clé meta color et la valeur meta white :

$rd_args = array(
	'meta_query' => array(
		array(
			'key' => 'color',
			'value' => 'white',
			'compare' => '!='
		)
	)
);
 
$rd_query = new WP_Query( $rd_args );

Comment récupérer des posts wordpress par multiples meta_value

Récupérons maintenant tous les posts avec une valeur de champ personnalisé color égale à white ou green :

// custom field name is color and custom field value is 'white' OR 'green'
$rd_args = array(
	'meta_query' => array(
		array(
			'key' => 'color',
			'value' => array('white','green'),
			'compare' => 'IN'
		)
	)
);
 
$rd_query = new WP_Query( $rd_args );

Obtenez tous les posts (les produits dans la boutique en ligne par exemple) sauf les produits blancs et les produits verts :

$rd_args = array(
	'meta_query' => array(
		array(
			'key' => 'color',
			'value' => array('white','green'),
			'compare' => 'NOT IN'
		)
	)
);
 
$rd_query = new WP_Query( $rd_args );

Comment utiliser “compare” dans les meta_query

Comme vous pouvez le voir dans l’exemple ci-dessous et dans d’autres exemples, il y a un paramètre de comparaison dans chacun d’entre eux. J’aimerais maintenant montrer quelles valeurs il peut accepter et ce qu’elles signifient.

  • = : (ou non défini) Égal à,
  • != : N’est pas égal à,
  • < : Moins de,
  • <= : inférieur ou égal à,
  • > :Plus grand que,
  • >= : Supérieur ou égale à, par exemple :
// the product price in this example is 2000 or more than 2000:
$args = array(
	'meta_query' => array(
		array(
			'key' => 'price',
			'value' => 2000,
			'type' => 'numeric', // specify it for numeric values
			'compare' => '>='
		)
	)
);
  • LIKE : Permet de rechercher dans les méta-valeurs une chaîne spécifique, dans l’exemple ci-dessous la requête retourne tous les messages où “first_name” contient John, il peut aussi être Johnny, Johnathan, ou jenesaisJohnquelquechose :
$args = array(
	'meta_query' => array(
		array(
			'key' => 'first_name',
			'value' => 'John',
			'compare' => 'LIKE'
		)
	)
);

Deux choses encore : premièrement – ce n’est pas sensible à la casse, deuxièmement – les caractères génériques @ ne sont pas nécessaires.

  • NOT LIKE : similaire à LIKE fonctionne de manière inverse : la méta-valeur ne doit pas contenir la chaîne donnée.
  • IN : la meta value doit contenir une des valeurs du tableau donné, vous pouvez voir l’exemple ci-dessus
  • NOT IN : les méta-valeurs ne doivent contenir AUCUNE des valeurs du tableau donné.
  • BETWEEN : la meta value devrait se situer entre la plage de valeurs donnée, par exemple :
// the product price is more than 2000 and less than 4000
$args = array(
	'meta_query' => array(
		array(
			'key' => 'price',
			'value' => array( 2000, 4000 ),
			'type' => 'numeric',
			'compare' => 'BETWEEN'
		)
	)
);

Il peut également fonctionner pour les dates, voir l’exemple ci-dessous.

  • NOT BETWEEN : Ne doit pas se trouver dans une fourchette donnée
  • EXISTS : (WordPress >= 3.5) Si une méta-valeur d’une méta-clé spécifique existe ou est vide/nulle.
$args = array(
	'meta_query' => array(
		array(
			'key' => 'misha_key',
			'compare' => 'EXISTS'
		)
	)
);

Ainsi, en fait, il vérifie si une méta-clé existe, vous n’avez même pas besoin de passer une valeur avec ce paramètre.

  • NOT EXISTS : (WordPress >= 3.5) : si une méta-clé donnée n’existe pas du tout.
  • REGEXP : (WordPress >= 3.7) : il vous permet de comparer des méta-valeurs avec des expressions régulières, par exemple :
$args = array(
	'meta_query' => array(
		array(
			'key' => 'misha_key',
			'value' => '^[0-9]*$', // "misha_key" must be only numbers
			'compare' => 'REGEXP'
		)
	)
);
  • NOT REGEXP : (WordPress >= 3.7) : Similaire à REGEXP mais les méta-valeurs ne doivent pas correspondre à votre expression rationnelle donnée.
  • RLIKE : (WordPress >= 3.7) : c’est un synonyme de REGEXP

Comment utiliser compare => between pour la recherche de post selon des dates sous WordPress ?

Vous pouvez également utiliser meta_query pour vérifier si un champ personnalisé se trouve entre deux dates.

La chose la plus importante que vous devez garder à l’esprit est que votre format de date doit être comme YYYY-MM-DD ou YYYY/MM/DD ou quelque chose comme ça (l’année commence, puis le mois, puis le jour, puis l’heure si vous le souhaitez). Vérifiez comment il est stocké dans la base de données – s’il est stocké dans un autre format, par exemple les jours passent en premier, alors le filtrage ne fonctionnera pas pour vous jusqu’à ce que vous changiez la présence des dates dans la base de données.

array(
	'key' => 'sale_day',
	'value' => array( '2018-01-01', '2018-01-09' ),
	'compare' => 'BETWEEN'
)

Si la date est stockée en heure UNIX, exemple : 154333391233, c’est aussi simple :

array(
	'key' => 'sale_day',
	'value' => array( strtotime('2018-01-01'), strtotime('2018-01-09') ),
	'type' => 'numeric',
	'compare' => 'BETWEEN'
)

Comment récupérer des posts par plusieurs paires de clé/valeur avec les multiples meta_queries

Maintenant je vais vous montrer comment combiner les posts par plusieurs (deux ou plus) valeurs de champs personnalisés. Tout d’abord, permettez-moi de vous présenter le paramètre relationnel qui peut accepter deux valeurs – OU ou ET (par défaut).

// the 'color' is 'white' AND the 'price' is more than 2000 and less than 4000
$rd_query = new WP_Query( array(
	'meta_query' => array(
		'relation' => 'AND', // both of below conditions must match
		array(
			'key' => 'show_on_homepage',
			'value' => 'on'
		),
		array(
			'relation' => 'OR', // only 'color' OR 'price' must match
			array(
				'key' => 'color',
				'value' => 'white'
			),
			array(
				'key' => 'price',
				'value' => array( 2000, 4000 ),
				'type' => 'numeric',
				'compare' => 'BETWEEN'
			)
		)
	)
) );

Comme vous pouvez le voir, dans la meta_query ci-dessus, nous avons utilisé des relations multiples.

Comment trier les posts par méta-valeurs (paramètres “orderby” et “order”) dans WordPress

Je vais vous montrer différents exemples de la façon dont vous pouvez classer vos posts par méta-valeurs. Tout d’abord, regardez ce simple exemple de code, où nous n’utilisons même pas de méta requête :

$args = array(
	'meta_key' => 'my_key',
	'orderby' => 'meta_value'
);

Maintenant, disons que my_key ne contient que des valeurs numériques, nous pouvons changer notre code pour ce cas juste un petit peu.

$args = array(
	'meta_key' => 'my_key',
	'orderby' => 'meta_value_num'
);

Mais comment l’utiliser avec une méta requête ? Simple, il suffit de changer notre code de la façon suivante :

$args = array(
	'meta_query' => array(
		'misha_clause' => array(
			'key' => 'my_key',
			'compare' => 'EXIST'
		)
	),
	'orderby' => 'my_clause'
);

Comment ordonner une meta_query par plusieurs meta_key dans Wordpres ?

Oui c’est possible depuis WordPress 4.2

$args = array(
	'meta_query' => array(
		'relation' => 'AND',
		'price_clause' => array(
			'key' => 'price',
			'value' => array( 2000, 4000 ),
			'type' => 'numeric',
			'compare' => 'BETWEEN'
		),
		'my_clause' => array(
			'key' => 'my_key',
			'compare' => 'EXISTS'
		), 
	),
	'orderby' => array(
		'price_clause' => 'ASC',
		'my_clause' => 'DESC'
	),
);

Donc, tout d’abord nous ordonnons les post par price_clause en ordre croissant et ensuite nous ordonnons les posts par my_clause en ordre décroissant.

Conclusion

Voici un petit tour d’horizon dans les meta_query de WordPress. Comme vous pouvez le constater on peut faire à peu près ce qu’on veut maintenant. D’ailleurs avez vous lu mon post sur les techniques de modification de la Query WordPress ? Si vous avez des questions ou des avis n’hésitez pas à m’en faire part en commentaire 😉

Catégories : wordpress

siddhy

Développeur web full stack depuis une 15aine d'année dans une agence web du sud de la France et Geek depuis toujours, l'apprentissage et le partage font parti intégrante de ma philosophie au même titre que l'évolution personnelle et la sagesse bouddhiste.

0 commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *