Aujourd’hui nous allons voir comment fonctionne la fonction query_posts, qui nous servira dans d’autres tutoriels.
Tout d’abord a quoi peu bien nous servir cette fonction ?
La fonction query_posts peu nous servir a personnalisé une page d’accueil par exemple :
Admettons qu’ont veuillent insérer plusieur boucle (loop) différente sur notre page d’accueil de notre site :
Un entête avec une boucle contenant les cinq articles de la catégorie Nouveauté.
Ce qui nous donneraient avec la fonction query_posts :
// début de la boucle avec la fonction query_post <?php query_posts('cat=2&showposts=5'); while (have_posts()) : the_post(); ?> <?php the_content(); ?>// affiche du contenu de votre article <?php endwhile; ?> // fermeture de la boucle
Ici dans cette boucle j’ai indiqué a la fonction query_post que je voulais afficher la catégorie Nouveauté qui a pour identifiant 2 (cat=2)
et (&)
les 5 articles récent de cette catégorie (showpost=5)
. Voila un exemple simple de la fonction query_posts elle peu faire bien plus de choses voyons ca en détail.
Query_posts et les catégories de vos articles.
Cat et category_name pour afficher les catégories désirer.
query_posts("cat=2"); //Affiche les articles de la catégorie qui a pour identifiant 2 query_posts("cat=-2"); //Retire la catégorie qui a pour identifiant 2 query_posts("category_name=nouveaute"); //Affiche les articles de la catégorie "nouveaute" query_posts("cat=1,2,4"); //Affiche un série de catégories qui ont pour identifiant 1,2,4
A noter dans le code ci-dessus vous avez le choix avec l’identifiant de la catégorie, vous avez l’ID qui se récupère dans la barre d’adresse :
http://…../edit-tags.php?action=edit&taxonomy=category&tag_ID=2&post_type=post
Ou
L’identifiant normalisé du nom de votre catégorie qui est obtenu lorsque vous créer une catégorie exemple :
Nouveauté = nouveaute. Dans se cas ont utilisera category_name=nouveaute
. L’identifiant normalisé du nom de votre est plus pratique si par exemple vous créer une page d’accueil avec plusieurs boucle cela vous permet de vous repérez plus facilement dans le code ou chaque catégorie est afficher.
Afficher un article unique
P= et name va permettre l’affichage d’un seul article
query_posts('p=10'); //Affiche l'article avec l' identifiant 10 query_posts('name=titre-de-mon-article'); //Affiche l'article avec identifiant normalisé "titre-de-mon-article"
Idem que pour les catégories ont pourra utiliser l’identifiant :
http://…./post.php?post=692&action=edit&message=10
Ou
L’identifiant normalisé qui est le titre de votre article il est obtenu lors de l’édition de l’article sous le titre vous avez permalien : http://…/titre-de-mon-article et l’identifiant sera : name=titre-de-mon-article
Afficher une page unique
Page et pagename va permettre l’affichage d’une seule page
query_posts("page_id=4"); //Affiche la page avec l' identifiant 4 query_posts("pagename=contact"); //Affiche la page avec l’identifiant normalisé "contact"
Mais quel intérêt a affiché une page ? Cela pourrait servir dans le cas ou voulez par exemple afficher un formulaire de contact visible directement en page d’accueil.
Déterminer le nombre d’article a affiché
Showpost et offset va permettre d’afficher le nombre d’article désiré.
query_posts('showposts=7'); //Affiche les 7 premiers articles query_posts('offset=2');//On exclu les 2 premiers article
Showpost va indiquer que vous voulez afficher que 7 articles d’une catégorie, il affichera les articles par ordre de parution vous pouvez modifier aussi l’ordre d’affichage :
query_posts('orderby=post_date&order=desc')
orderby modifie l’ordre d’affichage :
post_date
– Trier par date de poste (qui est la valeur par défaut).
post_author
– Trier par l’auteur.
post_title
– Trier par titre.
post_modified
– Trier par date de modification.
post_menu_order
– Trier par ordre des menus .
post_parent
– Trier par parent.
post_id
– Trier par ID.
post_rand
– un ordre aléatoire.
Order ici ont affichera les articles par ordre décédant order=desc
pour les affiché dans un ordre ascendant ont utilisera order=asc
qui est la valeur par défaut.
vous pouvez obtenir plus d’information sur le codex wordpress
Offset permet de retirer des articles que vous vous pas affichez, prenons un exemple :
Vous avez créé une page pour une catégorie d’articles en entête vous voulez affichez le dernier article de cette catégorie et en dessous vous voulez affichez une liste de dix articles de la même catégorie :
La boucle pour afficher le dernier article de la catégorie sera :
<?php query_posts('cat=2&showposts=1'); while (have_posts()) : the_post(); ?>// début de la boucle <?php the_content(); ?>// affiche du contenu de votre article <?php endwhile; ?> // fermeture de la boucle
La boucle pour afficher les dix autres articles de la même catégorie sera :
<?php query_posts('cat=2&showposts=10&offset=1'); while (have_posts()) : the_post(); ?>// début de la boucle <?php the_content(); ?>// affiche du contenu de votre article <?php endwhile; ?> // fermeture de la boucle
Dans la première boucle j’ai combine cat=2
qui est l’identifiant de ma catégorie et(&)
showpost=1
qui indique que je veux qu’un seul article (le dernier publier dans la catégorie).
Dans ma deuxième boucle j’ai combiné cat=2
qui est l’identifiant de ma catégorie et(&)
showpost=10
qui indique que je veux afficher dix articles et(&)
offset=1
retire le premier article (( le dernier publier dans la catégorie).
Voila a quoi peu servir la fonction quey_post.
Voici une liste des fonction query_posts et que vous pouvez combiné selon vos besoins.
query_posts("tag=voiture"); //Affiche les articles qui ont le tag (mot clé) "voiture" query_posts("tag=voiture,vert"); //Affiche les articles qui ont le tag (mot clé) "voiture" OU "vert" query_posts("tag=voiture+vert+marque"); //Affiche les articles qui contiennent les 3 tags( mots clé) query_posts("author_name=auteur-m,admin"); //Affiche les articles de l'auteurs "auteur-m" et "admin" query_posts("author=6"); //Affiche les articles de l'auteur avec l'identifiant 6 query_posts("author=-8"); //Exclu les articles de l'auteur avec l'identifiant 8 query_posts("hour=01"); //Affiche les articles qui ont été publiés pendant l'heure 1 query_posts("minute=30"); //Affiche les articles qui ont été publiés pendant la 30ème minute query_posts("second=07"); //Affiche les articles qui ont été publiés pendant la 7ème seconde query_posts("day=1"); //Affiche les articles qui ont été publiés le 1er jour de la semaine query_posts("monthnum=1"); //Affiche les articles qui ont été publiés pendant le 1er moi query_posts("year=2010"); //Affiche les articles qui ont été publiés pendant l'année 2010 query_posts("posts_per_page=10"); //Affiche 10 articles par page
Conclusion
La fonction query_posts est très utile si ont veut personnaliser son site créer une page d’accueil, une page pour une catégorie d’article…. et bien d’autre, et sa vous permet de vous initiez au codage de wordpress et a sont fonctionement.
Salut tout le monde, je trouve votre article vraiment sympa, je viens par exemple de trouver un bout de code qui m’aide beacoup “query_posts(‘page_id=x’).
Cependant, est il possible d’afficher plusieurs page sur la page d’acceuil?
Bonjour Baron,
Pour afficher plusieurs pages il vous pouvez procéder comme ceci :
query_posts('page_id=4,5,6'); </code> pour affichez le titre de chaque page :<code> <?php wp_list_pages('include=5,9,23&title_li=') ; ?>
Merci,
Lorsque j’utilise “query_posts(page_id=’4,5,6′)”, les excerpts disparaissent et ce sont les textes entiers que j’obtiens à la place.
Donc la mention “Lire la suite” aura aussi disparu.
Essayer d’Ajouter cette fonction dans votre fichier function.php de votre thème :
add_action( 'init', 'my_add_excerpts_to_pages' );
function my_add_excerpts_to_pages() {
add_post_type_support( 'page', 'excerpt' );
}
Bonjour,
on peut mettre the_excerpt à la place de the_content.
mais du coup où on met “the_post_thumbnail” pour avoir une image mis en “image à la une” ?
Et est-ce possible ‘avoir une image et un extrait pour le 1er article et que les 4 autres juste un extrait sans image?
MErci
Bonsoir Darknote,
Oui vous pouvez mettre the_excerpt à la place de the_content.
Vous pouvez placer vos miniatures comme ceci :
<?php query_posts('cat=0&showposts=4'); while (have_posts()) : the_post(); // début de la boucle ?>
<?php echo get_the_post_thumbnail($post->ID, 'id-thumb'); // affichage de la miniature ?>
<h2 class="title"><?php the_title(); // affichage du titre?></h2>
<?php the_excerpt(); // affichage de l'extrait ?>
<?php endwhile; // fin de la boucle ?>
Si vous ne voulez pas d’image pour certains articles il vous suffit de ne pas mettre d’image à la une.
J’ai fais un tutoriel la dessus : Comment créer une liste d’articles avec miniatures
Bonjour,
merci pour le code, je pensais qu’il y avait un code spéciale pour ne pas avoir des images à la une et non pas simple ne pas mettre cette fonction.
par exemple, ce thème http://izithemes.com/demo/Exciter/
les catégories Music , Health, General, Sports fonctionnent comme ça ?
Merci
Bonjour,
Dans le cas de votre exemple on utilise deux boucles une avec la miniature, le titre l’extrait et la deuxième juste avec le titre le l’article en utilisant l’argument offset qui vas retirer le dernier article paru dans la catégorie pour afficher à partir de l’avant-dernier article publié.
Première boucle :
<?php query_posts('cat=0&showposts=1'); while (have_posts()) : the_post(); // début de la boucle ?>
<?php echo get_the_post_thumbnail($post->ID, 'id-thumb'); // affichage de la miniature ?>
<h2 class="title"><?php the_title(); // affichage du titre ?></h2>
<?php the_excerpt(); // affichage de l'extrait ?>
<?php endwhile; // fin de la boucle ?>
<?php wp_reset_query(); ?>
Deuxième boucle :
<?php query_posts('cat=0&showposts=4&offset=1'); while (have_posts()) : the_post(); // début de la boucle ?>
<a href="<?php the_permalink() ?>" rel="bookmark" title="<?php _e('Lien vers'); ?> <?php the_title_attribute(); ?>" >
<h2><?php the_title(); // affichage du titre avec le lien ver l'article ?></h2>
</a>
<?php endwhile; // fin de la boucle ?>
<?php wp_reset_query(); ?>
Et surtout ne pas oublier de mettre la fonction wp_reset_query a chaque fin de boucle elle permet de rétablir les valeurs par défaut pour ne pas avoir de bug dans les autres boucles.
D’accord, je ne connaissais pas cet astuce, merci beaucoup!!
je suis sûr que c’est des codes qui pourraient servir à plusieurs personnes, quand je vois le nombre de gens qui veulent un thème magazine, ce code va dans ce sens, merci beaucoup
Bonjour,
Je voudrais faire un truc très simple :
Jusque là, pas de soucis …. La grande question est : ou est ce que ce code doit être mit pour qu’il puisse estre afficher sur une seule page ?
Merci
Pardon mon code m’a pas été pris en compte .
Voici le bout de code :
<?php query_posts('cat=0&showposts=4'); ?>
Merci
Bonjour JF,
Tous d’abord pour afficher des articles sur une seule page vous devez créer une page template , faite un copier-coller du fichier page.php de votre thème puis renommer le exemple page-macategory.php ensuite il faut placer le nom de la page template dans l’en-tête du fichier ( comme ci-dessous) et après supprimer la boucle de la page et ajouter votre boucle(query_post) a l’intérieur de votre balise html comme ceci :
<?php
/**
* Template Name: Ma catégorie
*
*
*/
get_header(); ?>
<div id="container">
<div id="content" role="main">
<!– début de la boucle avec la fonction query_post –>
<?php query_posts('cat=0&showposts=4'); while (have_posts()) : the_post(); ?>
<?php the_title();?> <!– titre de l'article –>
<?php the_excerpt(); ?> <!– affiche du contenu de votre article –>
<?php endwhile; ?> <!– fermeture de la boucle –>
</div><!– #content –>
</div><!– #container –>
<?php get_sidebar(); ?>
<?php get_footer(); ?>
Après vous avez juste a sélectionner le modèle page-macategory quant vous éditez une page.
Bonjour Fred,
Merci beaucoup, ça marche super bien.
Tout fois j’aurais une autre question maintenant que j’affiche juste un article .
Existe-t-il un résumé ou alors un modèle pour utiliser le “sidebar-squeeze” de buddypress.
J’ai bien noté que ça marche selon la forme
<div>
<div id="content">
ma parti de gauche
</div>
<div id="sidebar-squeeze">
<div id="main-column">
</div>
<?php get_sidebar( 'buddypress' ); ?>
</div>
</div>
Sauf que visiblement la feuille de style spécifie des tailles et position entre la barre latérale et le contenu.
Je me retrouve avec ma barre lattéral en dessous du ma partie gauche . en revanche la sidebar est bien à droite et de la bonne largeur …. mais en desous du text au lieu d’être à coté.
Si tu avais une idée de l’endroit ou j’ai fait une erreur .
Merci
JF
Problême résolu,
il faut ne faut pas utiliser ID=”sidebar-queeze”.
<div>
<div id="content">
ma parti de gauche
</div>
<div> <!– C'est ici que ça ne marchait pas –>
<div id="main-column">
</div>
<?php get_sidebar( 'buddypress' ); ?>
</div>
</div>
Voila merci pour ton aide
JF
Hello et bravo pour le tuto, c clair !
Je cherche un code pour afficher sur ma page article, des articles aléatoire de la même catégorie. J’ai beau tourner dans tous les sens j’y arrive pas …
Merci
Bonjour Skoop,
Merci 😉
Vous avez la boucle toute prête dans ce tuto : Comment utiliser la requête WP query pour l’affichage de vos articles , avec un tableau d’arguments.
Désolé mais je ne trouve pas.
en fait j’aimerai que “cat” soit variable (en fonction de la catégorie de l’article) et non pas fixe (ex : 2). Et justement je n’arrive pas à appeler cette variable…
articles similaires :
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); $category = get_the_category($post->ID); echo $category[0]->cat_name; $thumb = get_post_meta($post->ID, 'thumb', true); if ($thumb == ”); ?>
<?php query_posts(array('orderby' => 'rand', 'showposts' => 4, 'category_name=>'$category;”)); ?>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
<?php endwhile; ?><?php endif; ?>
jsuis pas une flèche en prog …
OK j’avais pas compris ca désolé,
Votre code a des fautes de syntaxe et la fonction query_post n’est pas très adapter pour des boucles complexe comme celle que vous voulez mais la base était assez bien partie , ont va plutôt utiliser wp_query qui va permetre d’identifier l’article et sa catégorie et ensuite d’interprèté une boucle pour affiché les articles similaire par catégorie avec un ordre aléatoire . il faut placer le code après la boucle de l’article principale.
Code :
<?php // Code a insérer après la boucle principal de l'article
$categories = get_the_category($post->ID);
if ($categories) {
$category_ids = array();
foreach($categories as $individual_category) $category_ids[] = $individual_category->term_id;
$args=array(
'category__in' => $category_ids, // catégorie de l'article
'post__not_in' => array($post->ID), // Id de l'article
'showposts'=>5, // Nombre d'article
'orderby' => 'rand', // Ordre des articles
'caller_get_posts'=>1 // on retire l'article principal pour ne pas le dupliqué
);
$related_query = new WP_Query($args);
if ($related_query->have_posts()) {
?>
<?php // Boucle avec les éléments (title,excerpt…) ?>
<ul>
<?php
while ($related_query->have_posts()) : $related_query->the_post();
?>
<li>
<a href="<?php the_permalink() ?>" > <?php the_title();?> </a>
</li>
<?php
endwhile;
?>
</ul>
<?php // Fin de la boucle ?>
<?php }
wp_reset_query(); // Reset de la boucle important !
}
?>
A l’interrieur de la boucle vous ajouter les marqueurs et fonctions que vous voulez comme dans une boucle avec query_post (vignette , titre,extrait,date…)