8768 sujets

Développement web côté serveur, CMS

Bonjour à toutes et à tous,

Je suis entrain de construire un thème wordpress pour une association et je rencontre des difficultés avec la boucle wordpress ainsi que la manière de la customiser pour afficher ce que l'on veut.

La situation : j'ai différents produits (légumes, fruits, pain, gallette, etc) et je veux les afficher sur une page dédiée, accessible depuis l'accueil, qui va afficher les bons produits selon que l'on clique sur le lien "Légumes & Fruits" ou "Céréals" ou "Viandes", etc.

J'ai donc commencé par créer une page "Légumes & Fruits" et une autre page "Céréals". J'ai ensuite créer dans le function.php, des customs posts ainsi qu'une taxonomy pour pouvoir gérer les produits dans l'admin de wordpress :

// Ajouter un nouveau type de post (custom post) : les produits
	add_action('init', 'my_custom_init');
	function my_custom_init()
	{
	register_post_type(
		  'produit',
			  array(
			    'label' => 'Produits',
			    'labels' => array(
			      'name' => 'Produits',
			      'singular_name' => 'Produits',
			      'all_items' => 'Tous les produits',
			      'add_new_item' => 'Ajouter un produit',
			      'edit_item' => 'Éditer le produit',
			      'new_item' => 'Nouveau produit',
			      'view_item' => 'Voir le produit',
			      'search_items' => 'Rechercher parmi les produits',
			      'not_found' => 'Pas de produits trouvé',
			      'not_found_in_trash'=> 'Pas de produits dans la corbeille'
			      ),
			    'public' => true,
			    'capability_type' => 'post',
			    'supports' => array(
			      'title',
			      'editor',
			      'thumbnail'
			    ),
			    'has_archive' => false
			  )
			);
	register_taxonomy(
			  'type',
			  'produit',
			  array(
			    'label' => 'Types',
			    'labels' => array(
			    'name' => 'Types',
			    'singular_name' => 'Type',
			    'all_items' => 'Tous les types',
			    'edit_item' => 'Éditer le type',
			    'view_item' => 'Voir le type',
			    'update_item' => 'Mettre à jour le type',
			    'add_new_item' => 'Ajouter un type',
			    'new_item_name' => 'Nouveau type',
			    'search_items' => 'Rechercher parmi les types',
			    'popular_items' => 'Types les plus utilisés'
			  ),
			  'hierarchical' => true
			  )
			);
	}


Ensuite j'ai ajouté les produits via l'admin et j'ai ajouter différencié les produits via les taxonomy, en ajouter des types comme "legumes_fruits" ou bien "cereals" afin de pouvoir trier dans ma boucle pour n'afficher que les produits correspondants.

Enfin, j'ai créé un template de page pour afficher les produits : "template-pageproduit.php". A l'intérieur se trouve ma fameuse boucle qui me casse les pieds car malgré que je lui spécifie que je ne veux que tel ou tel produit, elle m'affiche tout ! Quoi que je fasse... Avez-vous une solution s'il vous plait ? Merci d'avance à ceux qui me répondront ! Smiley smile

Voici le code de template-pageproduit.php :
/*
Template Name: Page_Produits
*/
?>
<?php get_header(); ?>
<div class="row main_content page_produits">
	<h1><?php the_title(); ?></h1>
	<?php
                // On récupère l'identifiant de la page appelée et on teste pour savoir quel produit est demandée 
		/* on fait de $wp_query une variable globale */
		 global $wp_query;

		/* on stocke la variable dans un nom de variable inutilisé */
		 $page_ID = $wp_query->post->ID;
		if($page_ID == 40) {
			$produits = 'legumes_fruits';
		}
		elseif($page_ID == 42) {
			$produits = 'cereals';
		}
	 ?>
	<?php
		// personalisation de la boucle
		$args= array(
				'post_type' => 'produit', // on affiche seulement les produits
				'taxonomy' => $produits,  // on trie les produits par type
				'order' => 'ASC'   // on affiche les produits par ordre ascendant 
				  );
	?>
	<?php query_posts($args); ?>
	<!-- Début de la première boucle -->
	<?php while (have_posts()) : the_post();?>
	<!-- Affichage du contenu de la boucle-->
	<section class="col-lg-4 bloc_gauche">
		<div class="entete">
			<?php the_post_thumbnail('full', array('class' => 'alignleft')); ?>
			<h1><?php the_title(); ?></h1>
		</div>
		<div class="produit">
			<?php the_content(); ?>
		</div>
	</section>
	<?php // Fin boucle
	endwhile;
	wp_reset_query();
	?>
</div>
<?php get_footer(); ?>
Bonjour.

Il ne faut jamais utiliser query_posts quand on peut faire autrement comme indiqué dans la doc (donc jamais car on peut toujours faire autrement Smiley ravi ). Plutôt utiliser WP_Query.

Pour récupérer les post issus d'une taxonomie il faut utiliser le code suivant :


$args = array(
	'post_type' => 'post',
	'tax_query' => array(
		array(
			'taxonomy' => 'people',
			'field'    => 'slug',
			'terms'    => 'bob',
		),
	),
);
$query = new WP_Query( $args );


valeurs à remplacer bien sur par le bon post type et la bonne taxo.

Et enfin il y a déjà dans Wordpress des templates prévus pour afficher les post issus d'une taxonomie. Basiquement il suffit de faire un fichier taxonomy-produit.php et d'y accéder par http://domain/produit/cereals/.

Pour plus d'info, lire : Hiérarchie des fichiers modèles)
Ok, merci beaucoup pour ces infos ! Je vois que je suis passé à côté d'un morceau important de wordpress pour les taxonomies... Smiley lol . Je reviens après avoir appliqué tous ces bons conseils.
Modifié par Bastien38 (27 Jul 2016 - 09:42)
Bon, gros merci Smiley biggrin puisque la situation s'est débloquée ! Il y a encore quelque chose que je ne comprends pas : qu'est-ce que signifie 'field' => 'slug' ?

J'aimerai bien aussi savoir si je suis obligé de passer par des conditions et tests pour afficher des types de produits spécifiquement ou si wordpress intègre cela nativement ? J'ai consulté différents templates comme archive.php et d'autres mais je n'arrive pas à tout comprendre au niveau du php...

Pour l'instant avec ce code, si je ne remplis pas 'terms' avec un type de produit, rien ne s'affiche et si j'en met un, il n'y a que les produits correspondant qui s'affichent, quel que soit le lien cliqué (céréals ou autres). Je cherche du côté de l'identifiant de mes produits ou bien les tag_ID... Encore merci !
Code de taxonomy-type_produit.php :
// personalisation de la boucle
		$args= array(
				'post_type' => 'produit', 
				'tax_query' => array(
						array(
							'taxonomy' => 'type_produit',
							'field'    => 'slug',
							'terms'    => 'legumes_fruits'
						)),
				'order' => 'ASC');
	?>
	<?php // the query
	$the_query = new WP_Query( $args ); ?>
	<?php if ( $the_query->have_posts() ) : ?>
		<!-- Début de la boucle -->
		<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
			<!-- Affichage du contenu de la boucle-->
			<section class="col-lg-4">
				<div class="entete">
					<?php the_post_thumbnail('full', array('class' => 'image_produit')); ?>
					<h1><?php the_title(); ?></h1>
				</div>				
				<div class="produit">
					<?php the_content(); ?>
				</div>
			</section>
		<?php endwhile; ?>
		<!-- Fin de la boucle -->
		<?php wp_reset_postdata(); ?>


[EDIT]
J'ai trouvé cette solution qui fonctionne :
// tests afin de savoir quel est le type de produit appelé afin de n'afficher que les produits correspondants
		if(is_tax( 'type_produit', array( 'legumes_fruits' ) ) ) {
			$produits = 'legumes_fruits';
		}
		elseif(is_tax( 'type_produit', array( 'cereals' ) ) ) {
			$produits = 'cereals';
		}

Modifié par Bastien38 (27 Jul 2016 - 11:47)
- Un slug c'est la chaine que tu as dans tes url et qui est créé à partir du titre :
j aime bien les kiwis => j_aime_bien_les_kiwis
comme legumes_fruits pour ta taxonomie.

- si tu as créé un template taxonomy-type_produit.php, tu n'as pas besoin de faire une wp_query à l'intérieur mais juste d'afficher la boucle classique.

Wordpress sait déjà les posts de quelle catégorie lister en fonction de l'url :

/type_produit/legumes_fruits affichera les post correspondants

Donc il te reste à faire un menu avec get_terms/ si tu veux faire un système de tri.

- Ce n'est pas bon de faire un test pour afficher un post ou non dans la boucle car si tu as une pagination tu vas avoir un nombre irrégulier de post par page. Dans le cadre d'une requête avec WP_Query il faut mieux modifier les arguments de la requête ($args) au préalable. c'est peut être ce que tu as fait Smiley cligne .
Modifié par bzh (27 Jul 2016 - 18:46)