web-dev-qa-db-fra.com

Impossible de faire fonctionner paginate_links avec une requête personnalisée

J'ai construit une section d'actualités sur mon site Wordpress avec les champs personnalisés avancés et les plug-ins d'interface utilisateur personnalisés. Sur la page de présentation des actualités personnalisée (pas les publications wordpress standard), je voulais limiter le nombre de nouvelles par page à six et fournir une navigation avec paginate_links. J'ai construit l'extrait suivant:

<section class="news-main" role="main">
    <?php
        $args = array(
            'post_type' => 'news',
            'posts_per_page' => '6'
        );
        $the_query = new WP_Query( $args );
        $temp_query = $wp_query;
        $wp_query = NULL;
        $wp_query = $the_query;
        $pagination = array(
            'base' => '%_%',
            'format' => '?page=%#%',
            'total' => $the_query->max_num_pages,
            'prev_next' => True,
            'prev_text' => __( '<< Previous' ),
            'next_text' => __( 'Next >>' )
        );
        if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
        <article class="news-snippet">
            <header class="news-box">
                <h2 class="mus-hi slogan-head fancy"><span class="fancy-hook"><?php the_time( 'j. F Y' ); ?></span></h2>
                <a href="<?php the_permalink(); ?>"><p class="bran-hn slogan-state closure"><?php the_title(); ?></p></a>
            </header>
            <div class="news-wrap">
                <p class="news-excerpt"><?php echo acf_excerpt( 'news_post', 35, ' <span class="news-more-inbox">[...]</span>' ); ?></p>
                <p class="bran-hn news-more"><a href="<?php the_permalink(); ?>">More &rarr;</a></p>
            </div>
        </article>
    <?php endwhile; ?>
        <?php wp_reset_postdata(); ?>
    <?php else: ?>
        <p>No entries</p>
    <?php endif; ?>
    <nav>
        <?php echo paginate_links( $pagination );
                $wp_query = NULL;
                $wp_query = $temp_query; ?>
    </nav>
</section>

Les arguments de wp_query sont d’abord définis, puis $the_query est défini avec un WP_Query, puis la variable $wp_query est enregistrée dans une variable temporaire, réinitialisée avec NULL, puis définie sur la variable $the_query. Dans la dernière étape, le tableau de paramètres pour paginate_links est défini. Ensuite, il y a la boucle de sortie des articles de presse. Après la boucle, la fonction paginate_links est appelée et le $wp_query a finalement été réinitialisé et écrit le contenu de la variable temporaire $temp_query.

Si j’ai, disons, 15 articles de blog, mon résultat est le suivant:

paginate_links layout

Si je survole le numéro trois, la fin du slug ressemble à ceci:

slug for page 3

Le problème est maintenant les liens précédents et suivants ne sont pas affichés même s'ils sont définis. Alors que le problème principal est le slug donné - si je clique sur le numéro trois, je tombe sur une page 404. "page 3" où je suis dirigé vers est inconnu pour wordpress. Merci d'avance Ralf

Mettre à jour:

$args = array(
    'post_type' => 'news',
    'posts_per_page' => '1'
);  
$the_query = new WP_Query( $args );
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $the_query;
$total_pages = $wp_query->max_num_pages;
if ( $total_pages > 1) {
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $current_page = new WP_Query('post_type=news&posts_per_page=1&paged=' . $paged);
    $pagination = array(
        'base' => '%_%',
        'format' => '?paged=%#%',
        'mid-size' => 1,
        'current' => $current_page,
        'total' => $total_pages,
        'prev_next' => True,
        'prev_text' => __( '<< Previous' ),
        'next_text' => __( 'Next >>' )
    );
}

Mise à jour 2:

Ok avec les modifications suivantes à la première partie du code, j'ai obtenu le nav qui fonctionne

$args = array(
    'post_type' => 'news',
    'posts_per_page' => '3',
    'paged' => get_query_var( 'paged' )
);  
$the_query = new WP_Query( $args );
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $the_query;
$total_pages = $wp_query->max_num_pages;
if ( $total_pages > 1) {
    $the_paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $pagination = array(
        'base' => @add_query_arg('paged','%#%'),
        'format' => '?paged=%#%',
        'mid-size' => 1,
        'current' => $the_paged,
        'total' => $total_pages,
        'prev_next' => True,
        'prev_text' => __( '<< Previous' ),
        'next_text' => __( 'Next >>' )
    );
}

La seule question qui me reste (la seule chose qui fonctionne encore mal) est-il possible que le premier lien ait un lien au lieu d'un lien /? Paginé = 1

1
rpk

En ce qui concerne le nombre de pages affichées, lisez les arguments de paginate_links , en particulier end_size et mid_size.

En ce qui concerne 404- Le problème est qu’il n’ya pas de page 3. Qu'une page renvoie ou non du contenu ou charge le modèle 404 est basée sur les résultats de la requête main , et non de votre requête personnalisée que vous exécutez dans le modèle. S'il s'agit d'un type d'article page, essayez de définir la variable paged au lieu de page.

4
Milo