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

  • WordPress :5.4
  • Statut : résolu
15 sujets de 46 à 60 (sur un total de 60)
  • Auteur
    Messages
  • #2371566
    ferman
    Participant
    Maître WordPress
    3785 contributions

    Bonjour,

    Je vous renvoie deux codes Le premier est “query_post” actualisé. Utilisez-le à la place de celui que vous utilisz actuellement. Le deuxième est le code “wp_query” de @flobogo que j’ai revu. Hier j’avais l’impression qu’il marchait mais non. Une erreur idiote de ma part trop longue à expliquer (à moins que vous ne soyez curieux). Le code que je vous envoie est “certifié fonctionnel” , enfin chez moi , soyons prudent mais je pense que ça devrait aller.

    J’ai nettoyé les deux codes et enlevé ce qui était inutile en particulier la navigation et le “paged” dont vous n’avez pas besoin puisque tout est sur la même page.  Pensez à remplacer les ID des catégories par les vôtres et vérifiez que vous n’avez pas de balise php “ouvrante” avant “get_header”.

    L’histoire du menu qui disparaît est bizarre: il n’y a aucune raison. Essayez avec les derniers codes. Si c’est toujours pareil, laissez le code pendant un moment que je puisse voir sur le site. (vous pouvez en plus faire une copie d’écran avant/après pour que je puisse bien voir de quoi il s’agit).

    get_header(); ?>
    
    		<div id="primary" class="content-area">
    		<main id="main" class="site-main" role="main">
    
    	<?php if ( have_posts() ) : 
    
    			if ( is_home() && ! is_front_page() ) : ?>
    				
    				<header>
    					<h1 class="page-title screen-reader-text"><?php single_post_title(); ?></h1>				
    				</header>
    				
    			<?php endif; 
    			
    	// Boucle 1 (1 post en tête)
    			
    			$args = array (
    			'post__in' => get_option( 'sticky_posts' ),
    			'ignore_sticky_posts' => 1,	
    			'posts_per_page'=>-1); // post in categories 3,4,5 will be displayed. 
            	
    			$first_query = new WP_Query($args); 
    				if($first_query->have_posts()):
    				while($first_query->have_posts()) : $first_query->the_post();
    				get_template_part( 'content', 'home' );
    				endwhile;
    				endif;
    	
    			wp_reset_postdata(); // reset the query
    			
    	// Boucle 2 (posts ordre aléatoire)
    		
    			$sticky = get_option( 'sticky_posts' );
    			$args = array(
    				'cat'        => 3, 
    				'ignore_sticky_posts' => 1,
    				'post__not_in'        => $sticky,				
    				'orderby'			  => 'rand',
    				'posts_per_page'	  => -1
    				);        	
    			$second_query = new WP_Query($args); 
    				if($second_query->have_posts()):
    				while($second_query->have_posts()) : $second_query->the_post();
    				get_template_part( 'content', 'home' );
    				endwhile;			
    				else : get_template_part( 'content', 'none' ); 
    				endif;
    		
    			wp_reset_postdata(); // reset the query
    		
    		endif;
    		
    		?>
    
    		</main><!-- #main -->
    		</div><!-- #primary -->
    
    <?php get_footer(); 
    Code WP_Query

    get_header(); ?>
    
    		<div id="primary" class="content-area">
    		<main id="main" class="site-main" role="main">
    		
    	<?php if ( have_posts() ) : 
    		
    			if ( is_home() && ! is_front_page() ) : ?>
    				
    				<header>
    					<h1 class="page-title screen-reader-text"><?php single_post_title(); ?></h1>				
    				</header>
    		
    			<?php endif;
    			
    	// Boucle 1 (1 post en tête)
    		
    			query_posts("cat=8&orderby=rand"); //catégorie "le nom que vous avez choisi": un seul post.
    				while ( have_posts() ) : the_post(); 
    				get_template_part( 'content', 'home' );				
    				endwhile;
    				wp_reset_postdata(); // reset the query
    			
    	// Boucle 2 (posts ordre aléatoire)	
    				
    			query_posts("cat=3&orderby=rand"); // catégorie "home"
    				while ( have_posts() ) : the_post(); 
    				get_template_part( 'content', 'home' );
    				endwhile;
    				wp_reset_postdata(); // reset the query
    			
    			else : get_template_part( 'content', 'none' ); 
    			
    		endif;
    			
    		?>
    		
    		</main><!-- #main -->
    		</div><!-- #primary -->
    		
    <?php get_footer(); 
    Code Query_posts

     

     

    • Cette réponse a été modifiée le il y a 2 semaines par ferman.
    #2371569
    Sabelya
    Participant
    Padawan WordPress
    74 contributions

    Merci encore pour votre temps @ferman !

    Précision :
    Je suis sur la version de WordPress 4.9.16 et non 5.4 comme précisé dans le Post, je ne m’en était pas rendu compte avant, je ne sais pas si cela peut expliquer qq soucis et j’en suis vraiment désolé si c’est le cas.

    Suite à votre dernier message, je comprends qu’on laisse tomber la fonction ‘au_hasard‘ intégrée à  functions.php  qui donnait un bon résultat mais bug du MENU (dommage, le code était plutôt très simple finalement).

    J’ai donc essayé les 2 codes, en tant que fichier  index.php.
    Sans la balise ouvrante du ‘get_header()’, je n’ai jamais eu de résultat correct (ce morceau étant interprété comme du texte..). Je rajoute donc la balise dans chacun des codes.

    • le 1er fonctionne maintenant parfaitement !! SUPER et BRAVO   🙂
    • le 2ème fonctionne mais ne garde pas l’article mis en avant en 1ère position comme recherché. Du coup j’ai un doute, faut-il comprendre que dans ce cas, l’article mis en avant doit être dans une catégorie différente de ‘home‘ qui est affichée (catégorie “le nom que vous avez choisi”: un seul post) ?

    Actuellement, le site tourne donc sur le 1er code en index.php

    #2371577
    ferman
    Participant
    Maître WordPress
    3785 contributions

    Le deuxième code utilise query_posts. Comme dit précédemment, il ne prend pas les articles épinglés. Il faut créer une catégorie spéciale , dans l’exemple c’est 8 et l’affecter à l’article qui doit rester en tête (remplacer “home” pour cet article)

    Dans le premier cas pour changer d’article en tête on dés-épingle/épingle un autre. Dans le deuxième cas on change de catégorie. Les deux se faisant sur la page d’édition de l’article. En temps , c’est équivalent.

    Le code dans fonctions.php (pre_get_posts) est le meilleur et le plus propre . Celui qui perturbe le moins la marche normale de la boucle wp mais vous me dites que ça vous fait perdre  le titre. Une précision: comme précisé plus haut #2371388,  pour utiliser correctement pre_get_posts, il faut que la boucle soit intacte. Donc votre index.php  doit être celui d’origine, pas transformé comme celui que vous avez actuellement. Pre_get_post se charge de tout (si vous avez mis un article épinglé). Essayez avec ces conditions; si ça marche c’est ce qu’il faut conserver à mon avis.

    #2371580
    Sabelya
    Participant
    Padawan WordPress
    74 contributions

    Oui c’est vraiment dommage car cela ne fait que rajouter 5 lignes au  functions.php  et ne nécessite plus de  index.php  dans le thème enfant (si je ne me trompe pas ?).
    Cela fonctionne bien donc avec ce pti bout de code dans  function.php  , mais avec bug du MENU

    // Tri aléatoire Home
    function au_hasard( $query ) {
    	if ( $query->is_home ) {
    		$query->set( 'cat', '29' );
    		$query->set('orderby', 'rand'); }
    	return $query;
    }
    add_filter( 'pre_get_posts', 'au_hasard' );

    Voici le visuel avec disparition du MENU en haut à droite.

    Fichiers joints :
    Vous devez être connecté pour voir les fichiers joints.
    #2371587
    ferman
    Participant
    Maître WordPress
    3785 contributions

    Je me rends compte que en fait chez moi aussi et que c’est un phénomène connu. On ne va pas se prendre la tête avec ça puisque vous avez une solution . Je regarderai à l’occasion. Je regarderai aussi pour laisser l’aléatoire durer 24h mais il ne faudra pas être pressé: ce sera à temps perdu. Cochez la case” me prévenir des réponses par e mail”.

     

    #2371590
    Sabelya
    Participant
    Padawan WordPress
    74 contributions

    Merci beaucoup @ferman !

    #2371591
    ferman
    Participant
    Maître WordPress
    3785 contributions

    Pour le problème du menu qui disparaît, je pense avoir la solution. En fait ça dépend de la manière dont le thème est construit. Certains ne posent pas de problème, pour d’autres c’est plus compliqué. Je pense que la fonction modifiée comme suit répond est valable pour tous les cas.

    function au_hasard( $query ) {
    	
        if ( ! is_admin() && is_home()){
    	if ('nav_menu_item' !== $query->get('post_type') ){
    		$query->set( 'cat', 3 );
    		$query->set('orderby', 'rand'); 
    	return $query;
    	}
      }
    }
    add_filter( 'pre_get_posts', 'au_hasard' );

    • Cette réponse a été modifiée le il y a 2 semaines par ferman.
    #2371593
    Flobogo
    Modérateur
    Maître WordPress
    17042 contributions

    Pour le code de @ferman, je propose de rajouter une ligne pour éviter le bug du menu. Pas sûre à 100%, mais pour une ligne de plus, ça vaut le coup :

    // Tri aléatoire Home
    function au_hasard( $query ) {
    	if ( $query->is_home ) {
    		$query->set( 'cat', '29' );
                    $query->set('post-type', 'post');
    		$query->set('orderby', 'rand'); }
    	return $query;
    }
    add_filter( 'pre_get_posts', 'au_hasard' );

    Si ça bugue encore, c’est qu’il faut réinitialiser la boucle avant ou après, mais je ne sais pas le faire sur ce type de code. Ferman pourra probablement finaliser si besoin. Il y a toujours plus d’idées dans plusieurs têtes que dans une seule. 😉

    Édit : la réponse de @ferman n’était pas visible quand j’ai répondu. Du coup, ne tenez pas compte de mon code ci-dessus, qui (une fois de plus) n’est pas correct. Comme je ne teste pas, je réponds d’après mes connaissances, qui s’avèrent insuffisantes. En matière de code, il faut bidouiller “en direct live” pour que ce soit efficace.

    • Cette réponse a été modifiée le il y a 2 semaines par Flobogo. Raison: Édit
    #2371604
    Sabelya
    Participant
    Padawan WordPress
    74 contributions

    Vous êtes supers  🙂

    Le nouveau code de @ferman fonctionne, le code de @flobogo fait tjrs apparaître le bug, un GRAND merci pour votre aide !

    #2371608
    ferman
    Participant
    Maître WordPress
    3785 contributions

    On a bien mérité un petit cadeau (pour moi une petite pédale sustain pour ma vieille (40 ans d’àge) Ovation Legend). C’est une plaisanterie bien sûr : on se fait plaisir en résolvant les problèmes.

    #2371611
    Sabelya
    Participant
    Padawan WordPress
    74 contributions

    Wow une Ovation ! Tellement originale et tellement rare maintenant..
    Si je peux rendre service, surtout n’hésitez-pas, avec grand plaisir  🙂

    #2371616
    Flobogo
    Modérateur
    Maître WordPress
    17042 contributions

    Je cède volontiers la pédale que j’ai gagnée @ferman (qui l’a bien méritée, d’ailleurs) … surtout que j’imagine bien que 2 pédales lui seraient plus utiles qu’une seule 🤣

    #2371617
    Sabelya
    Participant
    Padawan WordPress
    74 contributions

    🙂  J’espère en tous cas que vos activités professionnelles sont épargnées en cette période fatigante qui s’éternise..

    #2371710
    Flobogo
    Modérateur
    Maître WordPress
    17042 contributions

    Vu que je bosse dans le secteur de la santé (et bien que je ne sois ni infirmière, ni aide-soignante, ni médecin) non, je ne suis pas épargnée. 🙄
    Mais passer du temps sur le forum me permet de décompresser, en pensant à autre chose qu’au travail. 🙂

    #2373103
    ferman
    Participant
    Maître WordPress
    3785 contributions

    Bonjour,

    J’ai regardé la question du délai pour le changement d’affichage des produits et je pense avoir trouvé une solution pour que le changement aléatoire ne se produise que tous les…(intervalle de temps à choisir). Le problème est que tout le travail effectué au cours de la petite cinquantaine de questions/réponses ne servirait plus à rien. En effet, il n’y aurait plus besoin de modifier la boucle de wordpress puisque la randomisation se fait au niveau du navigateur.  Sans garantie: c’est assez expérimental et je ne sais pas comment ça se comporterait chez vous mais si vous voulez essayer, c’est possible. Sinon aucun problème – je ne sais pas si à votre place j’essaierais vu que ce que vous avez fonctionne bien –  je pourrai recycler la fonction pour d’autres usages (à commencer par les miens).

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