web-dev-qa-db-fra.com

Boucles de page décalées et pagination

J'ai vraiment eu du mal à faire en sorte que la boucle principale du fichier index.php fonctionne correctement avec les fonctions WP_Query. J'ai besoin que le tableau de grille de 6 images décrites en haut ne soit pas du tout compensé, tout en décalant la boucle principale de posts en dessous de 6 posts.

Tout ce qui implique query_posts () finit inévitablement par casser la pagination. L'utilisation d'une seule boucle corrige le problème de pagination, mais applique de manière non souhaitable le décalage à la section de grille sélectionnée. J'ai réussi à faire fonctionner la boucle principale de la pagination en utilisant le correctif recommandé de pre_get_posts https://codex.wordpress.org/Making_Custom_Queries_using_Offset_and_Pagination de WordPress. Toutefois, ce correctif remplace également par 6 les paramètres de boucle des publications en vedette.

Le dilemme décalage/pagination semble être un problème bien connu des développeurs WordPress. J'ai parcouru des dizaines d'articles, de forums et de didacticiels, mais je ne trouve pas beaucoup de documentation sur ce qu'il faut faire lorsque le correctif pre_get_posts annule d'autres paramètres de boucle personnalisés. sur l'index. Le pre_get_posts fonctionne à un degré, je veux juste que la mise en forme s'applique uniquement à la boucle des publications principales sur la page d'accueil, pas aux 6 publications les plus importantes.

Voici le code. Merci d'avoir pris le temps de lire ceci.

index.php:

<?php get_header(); 
do_shortcode( '[mg-masonry_js]' );
$options = get_option('mg_options');
$option_cats = $options['mg-posts-categories'];
$option_pg_number = $options['mg-posts-post-per-page'];
$args = array(
    'post_type' => 'post',
    'post_status' => array( 'publish' ),
    'posts_per_page' => $option_pg_number,
    'orderby' => 'date',
    'order' => 'DESC',
    'cat' => $option_cats,
    'offset' => 0,
);
?>

<div id="all-content-wrapper">
<div id="home-content" >
<div id="grid">

<?php if ($paged < 1 ) {
    $paged = get_query_var('paged'); ?>

<?php  // initialize main loop  ?>      

<?php   $grid_query = new WP_Query( $args );

    if ( $grid_query->have_posts() ) : 
        while ( $grid_query->have_posts()) : $grid_query->the_post(); 
?>

        <?php   switch ( $grid_query->current_post ) {
                case 0 :
        ?>
            <?php  // First featured image code here    ?>
            <?php   echo get_template_part('grid_featured');    ?>

                <?php break; ?>

            <?php  // Grid image array code here    ?>  
            <?php default : ?>
            <?php   echo get_template_part('grid'); ?>

        <?php } ?>  <?php  // end switch ?> 

    <?php endwhile; 

wp_reset_postdata(); 
rewind_posts();
else : ?>
        <h2><?php _e('No posts.', 'news portal' ); ?></h2>
        <br><br><p class="lead"><?php _e('No posts to display.', 'news portal' ); ?></p>
<?php endif; ?> 

<?php  }    // end paged switch ?> 
</div>   <?php // end grid ?> 

<div id="primary" class="content-area">
    <main id="main" class="site-main" role="main"> 

    <?php
        $args = array(
        'post_type' => 'post',
        'posts_per_page' => 10,
        'offset' => 6,
);
?>

<?/* Start the Loop */?>
    <? $main_query = new WP_Query( $args ); 
    if ( have_posts() ) :

        while ( have_posts() ) : the_post();

            get_template_part( 'template-parts/blog', get_post_format() );

        endwhile;

        echo regular_pagination();

    else :

        get_template_part( 'template-parts/content', 'none' );

    endif; ?>

</main><!-- #main -->
</div><!-- #primary -->

<?php news_portal_get_sidebar();?>

</div><!-- #all_content_wrapper -->

<?php get_footer();?>

functions.php:

/*--Offset Pre_Get_Posts pagination fix--*/
add_action('pre_get_posts', 'myprefix_query_offset', 1 );
function myprefix_query_offset(&$query) {

if ( ! $query->is_home() ) {
    return;
}

$offset = 6;

$ppp = get_option('posts_per_page');

if ( $query->is_paged ) {

    $page_offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );

    $query->set('offset', $page_offset );

}
else {

    $query->set('offset',$offset);

}
}

add_filter('found_posts', 'myprefix_adjust_offset_pagination', 1, 2 );
function myprefix_adjust_offset_pagination($found_posts, $query) {

$offset = 6;

if ( $query->is_home() ) {
    return $found_posts - $offset;
}
return $found_posts;
}
1
jcongerkallas1

Je me suis un peu plus amusé avec le code, et mon problème particulier a finalement été lié aux paramètres de l'énoncé if. Modification de la condition pour rechercher des requêtes sur la page d'accueil

if ( $query->is_home() && ! $query->is_main_query() ) {
    return;
} 

et

else {
    //This is the first page. Just use the offset...
    if ( $query->is_home() && $query->is_main_query()) {
    $query->set('offset',$offset);
}
}
}

fait en sorte que les arguments offset et posts par page existants soient vrais pour la boucle de requête principale, les conditions sinon par défaut déclarées dans le fichier index.php s'appliquant à la boucle de grille secondaire comme souhaité. La deuxième condition de la déclaration if devait être ajoutée, car sans elle, il existait un bogue de rupture de thème étrange qui supprimait régulièrement les six premiers éléments de la médiathèque et des publications.

Ces liens peuvent vous aider à résoudre des problèmes similaires:

https://wordpress.stackexchange.com/questions/tagged/pre-get-posts

Qu'est-ce qu'une "requête principale"?

https://wpshout.com/practical-uses-pre_get_posts/

https://www.billerickson.net/customize-the-wordpress-query/

2
jcongerkallas1