Salut à tous,
je voudrais savoir s'il y a un moyen de configuer un page article de façon différente que le réglage global du site, celui des option de lecture. Concrètement je voudrais que ma page d'accueil affiche 4 articles, ce qui est le cas, mais lorsque l'on est dans une page catégorie et qu'on les liste archives mensuelles par exemple, je voudrais qu'une dizaine d'articles s'affichent. C'est possible ?
Merci !

12 réponses


JC_Pires
Réponse acceptée

essai ça, j'ai refais l'indentation au passage:

    <?php
        $args = array(
            'date_query' => array(
                array(
                    'year'  => get_query_var('year') ,
                    'month' => get_query_var('monthnum')
                ),
            ),
            'posts_per_page' => 5,
        );
        $query = new WP_Query( $args );
    ?>
    <?php if($query->have_posts()): ?>
        <?php while($query->have_posts()): $query->the_post(); ?>
            <div class="left-post">
                <h2 class="left-post-title"><?php the_title(); ?></h2>
                <div class="left-post-content">
                    <div class="left-post-thumb">
                        <a href="<?php the_permalink(); ?>"><?php the_post_thumbnail('thumbnail'); ?></a>
                    </div>
                    <div class="left-post-txt">
                        <?php the_content('[lire la suite...]'); ?>
                    </div>
                    <div class="postdate">
                        Posté le <?php echo get_the_time('l j F Y'); ?> dans <?php echo get_the_category_list(', '); ?>
                    </div>
                    <div class="cb"></div>
                </div>
            </div>
            <hr>
        <?php endwhile;?>
    <?php endif; ?>
    <?php wp_reset_query();?>

Oui il faut que tu crées un template, et dans ta boucle wordpress choisir le nombre d'articles que tu veux.

<?php
    $args = array('posts_per_page' => '10');
    $query = new WP_query($args);
    while($query->have_posts()) : $query->the_post();
?>
    <article>
        <ul>
<?php foreach (get_the_category() as $category) : ?>
<?php $cate = $category->cat_name; ?>
            <li>
                <?= $cate; ?>
            </li>
<?php endforeach; ?>
        </ul>
        <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2><br>
                <?php the_post_thumbnail(); ?>
                <p><?php the_excerpt(); ?></p>
    </article>
<?php endwhile; ?>

Le code contenu dans la boucle while n'est qu'un exemple. À toi de le modifier.

hatfab
Auteur

Super, merci ! J'ai réussi à afficher plus de posts dans ma page en modifiant ma boucle suivant tes indications. En revanche je n'arrive pas à lui dire de n'afficher que les posts d'avril ou de mars par exemple. Je ne sais pas comment préciser ce paramètre.

hatfab
Auteur

En fait je ne comprends pas bien pourquoi ma page affiche tous les posts au lieu d'afficher uniquement les posts du mois. L'URL affichée est bien http://monsite/date/2015/03 et pourtant j'ai les posts de mars et avril qui s'affichent.
Voilà le code de ma boucle :

<?php
                $args = array('posts_per_page' => '100');
                $query = new WP_query($args);
            ?>
            <?php if($query->have_posts()): while($query->have_posts()): $query->the_post(); ?>
                 <div class="left-post">
                <h2 class="left-post-title"><?php the_title(); ?></h2>                
                <div class="left-post-content">
                    <div class="left-post-thumb"><a href="<?php the_permalink(); ?>"><?php the_post_thumbnail('thumbnail'); ?></a></div>
                    <div class="left-post-txt">
                        <?php the_content('[lire la suite...]'); ?>
                    </div>
                    <div class="postdate">Posté le <?php echo get_the_time('l j F Y'); ?> dans <?php echo get_the_category_list(', '); ?></div>
                    <div class="cb"></div>
                </div>
            </div>
                <hr>
        <?php endwhile; endif; ?>

C'est normal car tu redéfinis la requête.

essai ça:

  <?php
              query_posts('posts_per_page=5' );  
              if($query->have_posts()): while($query->have_posts()): $query->the_post(); ?>
                   <div class="left-post">
                  <h2 class="left-post-title"><?php the_title(); ?></h2>                
                  <div class="left-post-content">
                      <div class="left-post-thumb"><a href="<?php the_permalink(); ?>"><?php the_post_thumbnail('thumbnail'); ?></a></div>
                      <div class="left-post-txt">
                          <?php the_content('[lire la suite...]'); ?>
                      </div>
                      <div class="postdate">Posté le <?php echo get_the_time('l j F Y'); ?> dans <?php echo get_the_category_list(', '); ?></div>
                      <div class="cb"></div>
                  </div>
              </div>
                  <hr>
          <?php endwhile; endif; wp_reset_query();?>
hatfab
Auteur

Ça génère une erreur :
Fatal error: Call to a member function have_posts() on a non-object in /homepages/27/d557181032/htdocs/wp-content/themes/olga/archive.php on line 18

Ah ben oui normal la variable $query n'existe plus il faut donc l'enlever

essai ça:

    <?php
              query_posts('posts_per_page=5' );  
              if(have_posts()): while(have_posts()): the_post(); ?>
                   <div class="left-post">
                  <h2 class="left-post-title"><?php the_title(); ?></h2>                
                  <div class="left-post-content">
                      <div class="left-post-thumb"><a href="<?php the_permalink(); ?>"><?php the_post_thumbnail('thumbnail'); ?></a></div>
                      <div class="left-post-txt">
                          <?php the_content('[lire la suite...]'); ?>
                      </div>
                      <div class="postdate">Posté le <?php echo get_the_time('l j F Y'); ?> dans <?php echo get_the_category_list(', '); ?></div>
                      <div class="cb"></div>
                  </div>
              </div>
                  <hr>
          <?php endwhile; endif; wp_reset_query();?>
hatfab
Auteur

là ça bug plus effectivement, mais il m'affiche toujoursles posts de mars et d'avril sur la même page alors que dans la barre d'URL j'ai http://www.monsite.paris/date/2015/03

hatfab
Auteur

Super ! Ça marche parfaitement, merci. Le problème maintenant c'est que je n'ai rien compris :). Là j'ai pas le temps de regarder en détail ton code mais tu m'as sortie d'un mauvais pas urgent. J'essayerai de comprendre en détail un peu plus tard. Merci encore !

Source: https://codex.wordpress.org/Class_Reference/WP_Query#Date_Parameters

En gros dans ton objet WP_Query(), tu peut lui passer un tas de parametres comme pour notre problème la date. D'où le

    $args = [
            'date_query' =>[
                array(
                    'year'  => ... ,
                    'month' => ...
                ],
           ],
       ];
        $query = new WP_Query( $args );

D'où sors le get_query_var('year')?

Source: https://codex.wordpress.org/Function_Reference/get_query_var

En gros lorsque tu créés des liens avec les fonctions générées de wordpress, il passe des paramètre $_GET et pour year $_GET['year'] qui valais 2015 pour toi. C'est vraiment en gros l'explication des query_var() mais c'est pour que tu comprennes facilement. En gros tout les paramètres que wordpress a dans les url peuvent être retrouvé avec get_query_var() "la categorie, l'année, la page, ..." il te suffit de var_dump(et_query_var() ) sur n'importe qu'elle page pour voir quels sont les query_var() que tu peut récupérer.

hatfab
Auteur

Merci Jean-Christophe, je vais regarder tout ça…

Là, la pagination si tu l'a mets en place ne marchera pas, c'est à dire qu'il te sortira toujours les mêmes 5 post il faut que tu ajoutes ça à $args, ta requêtes deviens, et ajoutons la pagination par la même occasion, et organisons les:

    <?php 
      $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1; // On lui dis récupère l'argument 'page' et si il n'existe pas page=1
      $args = array(
              'date_query' => array(
                  array(
                      'year'  => get_query_var('year') ,
                      'month' => get_query_var('monthnum')
                  ),
              ),
              'posts_per_page' => 5,
              'paged' => $paged,
              'orderby' => 'date',
              'order'   => 'DESC',
          );
          $query = new WP_Query( $args );
          <?php if($query->have_posts()): ?>
          <?php while($query->have_posts()): $query->the_post(); ?>
              <div class="left-post">
                  <h2 class="left-post-title"><?php the_title(); ?></h2>
                  <div class="left-post-content">
                      <div class="left-post-thumb">
                          <a href="<?php the_permalink(); ?>"><?php the_post_thumbnail('thumbnail'); ?></a>
                      </div>
                      <div class="left-post-txt">
                          <?php the_content('[lire la suite...]'); ?>
                      </div>
                      <div class="postdate">
                          Posté le <?php echo get_the_time('l j F Y'); ?> dans <?php echo get_the_category_list(', '); ?>
                      </div>
                      <div class="cb"></div>
                  </div>
              </div>
              <hr>
          <?php endwhile;?>
          <?php posts_nav_link(); ?> // On ajoute la navigation « Previous Page — Next Page » pour pouvoir naviguer si il y a + de 5 posts
      <?php endif; ?>
      <?php wp_reset_query();?>

Source de pagination: https://codex.wordpress.org/Function_Reference/posts_nav_link