web-dev-qa-db-fra.com

Essayer d'exclure les 5 premiers articles de la première page de la page d'accueil

J'essaie d'exclure les 5 premiers articles de la première page de la page d'accueil, mais je ne parviens pas à bien faire les choses. C'est le patern que j'aimerais suivre:

  • Page 1: Poste 5, Poste 6, Poste 7, Poste 8, Poste 9
  • Page 2: Poste 10, Poste 11, Poste 12, Poste 13, Poste 14
  • Page 3: Post 15, Post 16, etc.
  • Page n = Post (n-1), Post n, Post (n + 1) (en termes mathématiques)

J'ai donc essayé d'utiliser le hook pre_get_posts et ajouté ce qui suit à mon functions.php file:

function my_function_for_excluding_posts( $query ) {
    if ($query->is_home() && $query->is_main_query()) {
        $query->set( 'offset', '5' );
    }
}
add_action( 'pre_get_posts', 'my_function_for_excluding_posts' );

Cela fonctionne en partie, car il exclut les cinq premiers articles, mais répète également les mêmes articles sur toutes les pages et ne suit donc pas le modèle que je recherche.

Ceci est mon fichier de boucle, qui fait essentiellement tout le travail, puisque mon single.php appelle simplement le fichier de boucle pour tout gérer, fondamentalement. Ceci est le fichier non altéré, puisque j'ai essayé d'ajouter un new WP_Query, mais que cela ne fonctionnait pas bien, alors le voici sans modifications:

<?php 
    global $post, $query_string, $SMTheme;
    query_posts($query_string);
    $i=1;
    if (have_posts()) :  

    if (!isset($_GET['ajaxpage'])) {?>
 <div class='articles'>
    <?php }
    while (have_posts()) : the_post(); 
    ?>
        <div class='one-post'>
        <div id="post-<?php the_ID(); ?>" <?php post_class("post-caption"); ?>>     
            <?php if (!is_single()&&!is_page()) { ?>
            <h2><a href="<?php the_permalink(); ?>" title="<?php printf( $SMTheme->_( 'permalink' ), the_title_attribute( 'echo=0' ) ); ?>" class='post_ttl'><?php the_title(); ?></a></h2>
            <?php } else { ?>
                <?php if (!is_single()) {?><h1 style="text-align:center;border-bottom:1px solid;margin-top:-10px;max-width: 100%;"><?php the_title(); ?></h1>
                <?php } else { ?><h1><?php the_title(); ?></h1>
            <?php } ?>
            <?php } ?>

            <?php if (!is_page()) {?><p class='post-meta'>
                <span class='post-date'><span class="day"><?php echo get_the_date('d'); ?></span><br /><span class="month"><?php echo get_the_date('M'); ?></span><br /><span class="year"><?php echo get_the_date('Y'); ?></span></span>           
                Publicado en &nbsp;<?php the_category(', '); ?>
                <?php if(comments_open( get_the_ID() ))  {
                    ?> &nbsp;| &nbsp;<?php comments_popup_link( 0, 1, '%' ); ?> &nbsp;Comentario(s)&nbsp;<?php
                } 
                edit_post_link( $SMTheme->_( 'edit' ), '     |     <span class="edit-link">&nbsp;', '</span>' );
                ?>
            </p><?php } ?>
                        <?php
                if(has_post_thumbnail())  {
                    ?><?php if (!is_single()) { ?><a href="<?php the_permalink(); ?>" title="<?php printf( $SMTheme->_( 'permalink' ), the_title_attribute( 'echo=0' ) ); ?>"><?php the_post_thumbnail(
                        array($SMTheme->get( 'layout', 'imgwidth' ), $SMTheme->get( 'layout', 'imgheight' )),
                        array("class" => $SMTheme->get( 'layout','imgpos' ) . " featured_image")
                    ); ?></a><?php } else { ?>
                        <?php the_post_thumbnail(
                        array($SMTheme->get( 'layout', 'imgwidth' ), $SMTheme->get( 'layout', 'imgheight' )),
                        array("class" => $SMTheme->get( 'layout','imgpos' ) . " featured_image")
                    ); ?>
                    <?php }
                }
                ?>
        </div>
        <div class='post-body'>

                <?php
                if (!is_single()&&!is_page()) {
                    if ( ! post_password_required() ) { smtheme_excerpt('echo=1'); } else the_content('');
                    ?><a href='<?php the_permalink(); ?>' class='readmore'><?php echo $SMTheme->_( 'readmore' ); ?></a><?php
                } else {
                    the_content('');

                }
            ?>
        <?php if (is_single()) { ?>
        <div class="navigation">
                <div class="alignleft"> <?php previous_post_link('%link', '&larr; %title', true); ?></div>
                <div class="alignright"><?php next_post_link('%link', '%title &rarr;', true); ?></div>
        </div>
        <?php  } ?>         
            <?php wp_link_pages(); ?>           
        </div>      
        </div>

    <?php endwhile; ?>

    <?php if (!isset($_GET['ajaxpage'])) {?>
 </div>
    <?php } ?>


<?php endif; ?>

Toute aide ou conseil sera très apprécié.

2
user1903782

offset annule la pagination, car lorsque vous arrivez au niveau de la requête, celle-ci est paginée via offset.

Vous pouvez toujours utiliser offset cependant, il vous suffit de faire quelques calculs pour multiplier le décalage souhaité par le numéro de la page en cours (notez que ce calcul fonctionne car posts par page et offset sont tous deux égaux à 5, vous devrez peut-être utiliser la valeur posts_per_page dans votre calcul si les deux sont différents):

function my_function_for_excluding_posts( $query ) {
    if ($query->is_home() && $query->is_main_query()) {
        $offset = 5;
        $paged = 0 == $query->get( 'paged' ) ? 1 : $query->get( 'paged' );
        $query->set( 'offset', $paged * $offset );
    }
}
add_action( 'pre_get_posts', 'my_function_for_excluding_posts' );

Filtre EDIT found_posts donc le nombre de pages est correct.

function myprefix_adjust_offset_pagination($found_posts, $query) {
    if ( $query->is_home() && $query->is_main_query() ) {
        return $found_posts - 5;
    }
    return $found_posts;
}
add_filter('found_posts', 'myprefix_adjust_offset_pagination', 1, 2 );
4
Milo