[Résolu] Articles aléatoires par catégorie (Créer un compte)

  • WordPress :5.4
  • Statut : résolu
15 sujets de 1 à 15 (sur un total de 17)
  • Auteur
    Messages
  • #2354940
    Sabelya
    Participant
    Padawan WordPress
    50 contributions

    Bonjour,

    Ma configuration WP actuelle

    • Version de PHP/MySQL : 7.1/5.6
    • Thème utilisé : Pictorico
    • Extensions en place : Woocomerce
    • Nom de l’hébergeur : OVH
    • Adresse du site : https://sabelya.fr

    Problème(s) rencontré(s) :

    Je souhaiterais que les articles soient classés de façon aléatoire suivant les catégories, je n’ai pas trouvé de plugin adapté.
    Merci d’avance.

    #2354974
    Sabelya
    Participant
    Padawan WordPress
    50 contributions

    Pour info, j’utilise les catégories comme base pour le Menu général. Je souhaiterais faire un tri ‘aléatoire’ des articles contenu dans les différentes catégories.

    J’ai trouvé ça sur le net :

    <?php 
    $the_query = new WP_Query('cat=1&showposts=15&orderby=rand');
    while ($the_query->have_posts()) : 
    $the_query->the_post();
    ?>
    "> - <?php the_title(); ?>
    <?php endwhile;?>

    Par contre, je ne sait pas comment l’utiliser, il n’y a pas de fichier category.php dans le thème..
    Peut-être qu’il y a plus simple en passant directement par la personnalisation du CSS.

    Merci.

    #2354980
    ferman
    Participant
    Maître WordPress
    2967 contributions

    Bonjour,

    Je ne crois pas que ça marcherait et ce serait de toute façon compliqué. Avec des CSS ce ne serait pas possible.  Il faudrait du javascript.  Plus simple, vous pourriez essayer les shortcodes woocommerce. Vous créez une page par catégorie avec un titre et vous y copiez/collez un shortcode comme ci-dessous. Limit=”12″ veut dire que 12 produits de la catégorie seront affichés au hasard. Vous en avez moins de 12 donc ça devrait aller.

    [products limit="12" columns="4" orderby="rand" category="nom de votre categorie"]

    J’espère que ce sera bon pour vous.

    #2354981
    Sabelya
    Participant
    Padawan WordPress
    50 contributions

    Merci Ferman pour la réponse. Je vais essayer votre proposition.

    Mais je comprends qu’il faut revoir le principe du Menu basé sur les catégories du coup ?

    #2354990
    ferman
    Participant
    Maître WordPress
    2967 contributions

    Mais je comprends qu’il faut revoir le principe du Menu basé sur les catégories du coup ?

    Avec les shortcodes oui, mais si ça marche je pense que ça revient à peu près au même: vous avez une page par catégorie comme maintenant.

    #2355000
    Flobogo
    Modérateur
    Maître WordPress
    16337 contributions

    Bonjour,


    @ferman
    : pourquoi le tri ne fonctionnerait pas avec le code PHP indiqué dans un fichier category.php ?

    Vous créez une page par catégorie

    Et sabeylka va se retrouver avec du contenu dupliqué que notre ami GG n’aime pas.

    @sabeyla :

    Si vous n’avez pas de fichier category.php, il suffit de le créer 🙂
    Vous copie le contenu de index.php, vous le collez dedans. Et vous cherchez ce qui ressemble à une boucle ( code du genre while / the_post / endwhile) et vous remplacez par celui que vous avez indiqué ci-dessus.
    Juste attention à ce début de ligne où vous avez ça : > - parce que je ne vois pas ce que ça fait là 🤔

    Vous envoyez votre fichier category.php dans le dossier de votre thème (idéalement un thème-enfant), et si ça plante, il faudra le supprimer.

     

    #2355004
    Sabelya
    Participant
    Padawan WordPress
    50 contributions

    Merci

    Flobogo !

    Je vais essayer cette idée dans un 1er temps pour conserver la structure existante si cela fonctionne, top ! J’ai testé pas mal de bouts de code dans un fichier category.php que j’ai déposé dans le dossier du thème ‘enfant’, sans résultat.

    Hum il y a du y avoir un pb dans le copier/coller je pense, ça donne plutôt :

    <?php 
    $the_query = new WP_Query('cat=1&showposts=15&orderby=rand');
    while ($the_query->have_posts()) : 
    $the_query->the_post();
    ?>
    <a href="<?php the_permalink() ?>"> - <?php the_title(); ?></a>
    <?php endwhile;?>

    Sinon, j’ai trouvé également ça, bien plus simple (?), en adaptant bien sûr :

    <?php
    if ( is_category("video")) {
        global $query_string; 
        query_posts($query_string . "&order=ASC"); 
    }

    A tester.

    #2355021
    Sabelya
    Participant
    Padawan WordPress
    50 contributions

    Alors, après de nombreux tests, je suis arrivé à un bon résultat !
    Créer un fichier unique category.php implique toutes les catégories existantes, il faut donc toutes les traiter au risque d’avoir un affichage ‘blanc’.
    J’ai donc choisit la solution la plus directe qui permet de cibler uniquement la catégorie souhaitée, avec un fichier category-cible.php, ‘cible‘ existant dans la liste des catégories.

    A l’intérieur, on y colle le contenu d’un index.php (merci Flobogo) puis on remplace la boucle par :

    <?php 
    $the_query = new WP_Query('category_name=cible&orderby=rand');	
    while ($the_query->have_posts()) : 
    $the_query->the_post();
    ?>			
    			
    <?php get_template_part( 'content', 'home' ); ?>
    			
    <?php endwhile;?>	
    category-cible.php

    Ca fonctionne !

    Seul différence, il manque l’affichage du titre de la catégorie en haut de de la page concernée, quelqu’un aurait une idée de comment rajouter cela ?

    Merci de votre aide.

    #2355066
    ferman
    Participant
    Maître WordPress
    2967 contributions

    Bonjour,

    Grâce à l’influence toujours stimulante de @flobogo 🙂 j’ai regardé un peu plus en détail et en fait, sans utiliser les shortcodes, la méthode est  beaucoup moins compliquée que je ne le pensais . Chez moi voila ce qui marche très bien :

    function aleatoire( $query ) {
    
        if ( ! is_admin() && $query->is_main_query() && ! $query->get( 'cat' ) ) {
    		$query->set( 'orderby', 'rand' );
        } 
    }
    add_action( 'pre_get_posts', 'aleatoire' );

    C’est inspiré de CET ARTICLE.

    Ce code est à mettre de préférence dans le fichier “functions.php” d’un thème enfant. Si vous n’en avez pas c’est facile à créer avec l’extension “Child theme configurator“. Si vous ne voulez pas en créer vous pouvez utiliser l’extension “my custom functions“. C’est simple mais lisez les FAQ et surtout ça: “Q. What to do if this plugin crashed the website?” qui vous dit comment rétablir la situation en cas de problème (pas grave et facilement réparable  par FTP). Pour le plugin, ne pas mettre de balises <? php  et ?>, juste copier/coller le code. Il vaut mieux éviter de mettre des codes dans functions.php du thème parent: ce sera effacé lors de la prochaine mise à jour du thème. Bien sûr on peut remettre le code après mais c’est un peu pénible, surtout si vous envisagez de mettre d’autres codes dans l’avenir.

    Voila j’espère que ça vous sera utile.

     

    • Cette réponse a été modifiée le il y a 2 semaines et 3 jours par ferman.
    #2355087
    Sabelya
    Participant
    Padawan WordPress
    50 contributions

    Merci Ferman ! 🙂

    Je vais essayer ça, d’autant plus que j’ai déjà un fichier ‘functions.php’ dans le dossier du thème enfant, du coup ça évite tout le reste et les bugs.

    #2355091
    Flobogo
    Modérateur
    Maître WordPress
    16337 contributions

    Avant de choisir l’une ou l’autre solution, il faut d’abord déterminer si :

    • vous voulez adopter ce type d’affichage aléatoire pour toutes vos catégories –> alors, il faut utiliser le fichier category.php
    • vous voulez l’affichage aléatoire sur une seule catégorie bien précise (“cible”, dans votre exemple) –> alors, utilisez en effet le fichier category-cible.php
      Mais le but, c’est de ne pas avoir un fichier pour chaque catégorie, sinon, autant utiliser le générique “category.php” qui les traite toutes de la même façon.

    Et si vous choisissez la 1ère solution, il faut enlever cat=1qui ne vise que la 1ère catégorie. Si on veut utiliser un fichier category.php qui soit utilisable quelque soit la catégorie, il ne faut pas en viser une en particulier, c’est logique. 🙂

    Donc, essayez simplement avec :

    <?php 
    $the_query = new WP_Query('showposts=15&orderby=rand');	
    while ($the_query->have_posts()) : 
    $the_query->the_post();
    ?>			
    			
    <?php get_template_part( 'content', 'home' ); ?>
    			
    <?php endwhile;?>	

     

    J’ai laissé showposts=15mais on peut l’enlever. Il sert à limiter l’affichage à 15 articles.

    Pour la question sur le titre de catégorie, je ferai une petite recherche ce WE si besoin de + d’infos sur le code  mais c’est facile, quelque chose comme get_category_name

    Une lecture utile : https://codex.wordpress.org/Category_Templates

     

    #2355099
    Sabelya
    Participant
    Padawan WordPress
    50 contributions

    Super, merci beaucoup pour l’aide  🙂

    Je suis preneur sur la manip pour le titre de la catégorie.

    #2355340
    Flobogo
    Modérateur
    Maître WordPress
    16337 contributions

    J’ai eu un peu de mal à retrouver, le codex (documentation de WP) n’existe plus sous sa forme précédente, et je suis moins à l’aise avec la version developer.wordpress.org

    Bref, essayez d’insérer ça avant la boucle d’affichage des articles :

    <?php single_cat_title('Category', 'display'); ?> 

    Ou même simplement ça :

    <?php single_cat_title; ?> 

    Ou encore

    <?php the_archive_title( '<h2 class="page-title">', '</h2>' ); ?>

    Désolée, ça fait un moment que je ne me suis pas penchée là-dessus, j’espère que l’un de ces codes vous conviendra.

     

     

    #2355344
    Sabelya
    Participant
    Padawan WordPress
    50 contributions

    Merci Flobogo.

    Le dernier code fonctionne, par contre il y a la mention Catégorie avant le nom de celle çi.

    #2355417
    Flobogo
    Modérateur
    Maître WordPress
    16337 contributions

    OK, on peut tenter un mix avec le 1er code (qui aurait dû fonctionner) :

    <h2 class="page-title"><?php single_cat_title(' ' ); ?></h2>

     

15 sujets de 1 à 15 (sur un total de 17)
  • Vous devez être connecté pour répondre à ce sujet.