8768 sujets

Développement web côté serveur, CMS

Bonjour,

Tout est dans le titre : j'essaie de créer une requête WordPress me permettant de récupérer les posts d'un tag et d'une catégorie du post en cours, avec un maximum de 4 résultats. Dans l'idée :

( UnTag ) AND ( UneCategorie ) AND ( MaxItems = 4 )


J'arrive à réunir les deux premières conditions, mais je suis bêtement bloqué devant la dernière, qui devrait pourtant être la plus simple : je n'arrive pas à limiter le résultat final à 4 items, au lieu de cela j'ai un maximum de 4 résultats pour le tag et la catégorie, donc jusqu'à 8 items.

Voici mon code :
// @link  https://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters
 
// @link  http://wordpress.stackexchange.com/questions/155937/
 
$arr = [
	'posts_per_page' => 4, // Nombre de résultats max, apparement le problème vient d'ici
	//'orderby' => 'date',
	'order' => 'ASC', // EDIT : Merci @audrasjb pour sa correction sur ce point...
	'post__not_in' => [ $post->ID ], // Ignorer le post en cours
	'tax_query' => [
		'relation' => 'AND',
		[
			'tag__in' => $tag_ids // Variable représentant l'ID d'un des tag du post
		],
		[
			'category__in' => $cat_ids // Variable représentant l'ID d'une des catégorie du post
		]
	]
];

$rel = new WP_Query( $arr ); // Les paramètre sont passés dans un WP_Query()


Merci d'avance si vous pouvez m'éclairer.
Modifié par Olivier C (09 Jun 2016 - 12:07)
Hello Olivier C,

Si je suis… on va dire bien familiarisé avec WP, je ne le suis pas avec la syntaxe que tu utilise ici, qui n'est pas dans les standards du codex. Mais passons Smiley smile

1er truc bizarre :
'order' => 'ASCs',

ASCs
C'est quoi le "s" minuscule ?

2ème truc bizarre :
La syntaxe de la tax_query que tu utilise, je ne l'ai jamais vue nulle part.
Chez moi, elle serait plutôt utilisée sous cette forme (celle du codex) :

'tax_query' => array(
                        'relation' => 'AND',
                        array(
			        'taxonomy' => 'tag',
			        'field'    => 'term_id',
			        'terms'    => $tag_ids,
                        ),
                        array(
                                'taxonomy' => 'category',
                                'field'    => 'term_id',
                                'terms'    => $cat_ids,
                        ),
),
Tiens, je n'arrive pas à éditer mon message précédent… Smiley confus

Petite correction, dans la première valeur attribuée au paramètre taxonomy, remplacer tag par post_tag, car tag ne correspond pas au slug des étiquettes par défaut de WP.

(sinon pour des réponses rapides et techniques sur WP, je ne peux que te conseiller le slack WordPress-Fr, qui est réactif et spécialisé. tu peux demander une invitation (évidemment gratuite) ici)
Bonjour Audrasjb et merci pour tes réponses.

L'aspect non familier du code est simplement dû à la différence de syntaxe que j'utilise pour les tableaux. En effet, plutôt que d'utiliser les array() j'utilise la version courte, les crochets [], disponible depuis php 5.4. Si WordPress garde l'ancienne méthode c'est, je pense, uniquement pour rester compatible avec la version 5.2 de php sous certaines configurations serveur. De toute façon pas de problème de ce côté ci en ce qui me concerne.

Merci pour 'ASCs', effectivement c'est bizarre et ce n'est pas dans les specs. Honnêtement je ne sais plus pourquoi j'utilisais cette syntaxe, une vieille relique dépréciée depuis longtemps peut-être... Ou pire : un code issu d'une époque antédiluvienne, alors que je n'y connaissais rien et que je copiais/collais de belles incantations php auxquelles je ne comprenais rien et qui me fascinaient par leur magie ! Quoi qu'il en soit il était resté dans mon workflow jusqu'à ce jour, je corrige déjà ce point donc.

Et merci aussi pour l'invitation Slack, je pense que je vais m'inscrire. Car en effet, si je me débrouille la plupart du temps avec le codex je galère encore souvent pour des trucs simples à priori. Et il est difficile d'obtenir une réponse appropriée sur le forum dédié (Ah ! Guy ! Qu'es-tu devenu ?).
Modifié par Olivier C (09 Jun 2016 - 05:53)
Bon, au pire, je limite les résultats recherchés via une condition dans la boucle While qui suit la requette :
$i = 0;
while ( ( $rel->have_posts() ) AND ( $i < 4 ) ) : $rel->the_post();
$i++;
/* Le code */
endwhile;

Mais c'est un peu dommage de limiter le nombre de résultats après coup. Après ce n'est pas trop grave car j'optimise quand même un peu au moment de l'appel à la bdd avec un maximum de 8 items. Si quelqu'un a mieux à proposer...
audrasjb a écrit :
Tu n'as pas testé mes correction sur ta tax_query mal formulée ?

Et bien... j'ai testé ceci :
	$arr = [
		'posts_per_page' => 4, // Nombre de résultats max
		//'orderby' => 'date',
		'order' => 'ASC',
		'post__not_in' => [ $post->ID ], // Ignorer le post en cours
		'tax_query' => array(
        	'relation' => 'AND',
            array(
			    'taxonomy' => 'tag',
			    'field'    => 'term_id',
			    'terms'    => $tag_ids
            ),
            array(
                'taxonomy' => 'category',
                'field'    => 'term_id',
                'terms'    => $cat_ids
            )
		)
	];

Qui ne me retourne pas de résultats exploitables a priori... voici ce que me retourne un var_dump() :
array(4) { ["posts_per_page"]=> int(4) ["order"]=> string(3) "ASC" ["post__not_in"]=> array(1) { [0]=> int(84) } ["tax_query"]=> array(3) { ["relation"]=> string(3) "AND" [0]=> array(3) { ["taxonomy"]=> string(3) "tag" ["field"]=> string(7) "term_id" ["terms"]=> NULL } [1]=> array(3) { ["taxonomy"]=> string(8) "category" ["field"]=> string(7) "term_id" ["terms"]=> array(1) { [0]=> int(8) } } } }
@audrasjb : je continue cette conversation sur Slack (puisque je me suis inscrit ! et que c'est spécifiquement du WP). Pour ne pas léser ce topic je posterais le résultat ici si j'en trouve un meilleur que les précédents.
Tu es sûr que le mélange des syntaxes pour les arrays imbriqué est autorisé ? (je n'en sais rien du tout je n'utilise pas la syntaxe avec les brackets)
audrasjb a écrit :
Tu es sûr que le mélange des syntaxes pour les arrays imbriqué est autorisé ? (je n'en sais rien du tout je n'utilise pas la syntaxe avec les brackets)

Y'a pas de raison, mais pour cette config' je vais tout repasser dans l'ancienne syntaxe, comme ça...

EDIT : le code suivant est le bon, tout était dans le OR... :
$arr = array(
	'posts_per_page' => 4,
	'post__not_in' => array( $post->ID ),
	'tax_query' => array(
		'relation' => 'OR',
		array (
			'taxonomy' => 'post_tag',
			'field'    => 'term_id',
			'terms'    => $tag_ids
		),
		array (
			'taxonomy' => 'category',
			'field'    => 'term_id',
			'terms'    => $cat_ids
		),
	),
);

Ou encore (si l'on aime les raccourcis) Smiley cligne :
$arr = [
	'posts_per_page' => 4,
	'post__not_in' => [ $post->ID ],
	'tax_query' => [
		'relation' => 'OR',
		[
			'taxonomy' => 'post_tag',
			'field'    => 'term_id',
			'terms'    => $tag_ids
		],
		[
			'taxonomy' => 'category',
			'field'    => 'term_id',
			'terms'    => $cat_ids
		]
	]
];

Qu'est-ce que j'ai galèré !
Modifié par Olivier C (11 Jun 2016 - 06:27)