web-dev-qa-db-fra.com

paginé> max_num_pages ne lancera pas 404

J'ai créé une nouvelle page dans WP administration appelée Blog et créé un modèle de page personnalisé. Dans le modèle, j'ai une requête personnalisée paginée simple.

$query = new WP_Query(array( 'post_type' => 'post', 'posts_per_page' => 1, 
'paged' => $paged ));

Tout semble aller pour le mieux, sauf lorsque je tape manuellement un numéro de page supérieur à celui disponible après la partie '/ page /' de l'URL. La page ne génère pas d'erreur 404 mais rend la page normalement, sans la boucle personnalisée. Est-ce un comportement normal? Si oui, comment devrais-je jeter la page de modèle 404?

Aussi, j'ai une sous question:

Est-il possible de créer une page de thème personnalisée sans avoir besoin de la créer dans l’administration wordpress? Dans la plupart des cas, je n'utilise même pas le contenu de la page et le laisse vide. Ensuite, si quelqu'un supprime la page ou modifie le slug de page, une partie du site Web peut être endommagée.

Existe-t-il une solution plus infaillible et plus conviviale pour les administrateurs?

PS: voici le code source complet de page-blog.php:

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

        <h1><?=get_theme_mod('crochelou-blog-main-headline') ?><span class="sub-headline"><?=get_theme_mod('crochelou-blog-sub-headline') ?></span></h1>
        <section id="page-container">
        <nav id="blog-nav-wrapper"><?php
            wp_nav_menu( array(
                'menu_id'        => 'category-menu',
                'menu' => 'category-menu'
            ) );
        ?></nav>
            <?php

            $query = new WP_Query(array( 'post_type' => 'post', 'posts_per_page' => 1, 'paged' => $paged )); ?>


            <section id="main-blog-loop"><?php
                if($paged > 1){ ?>
                    <a href="<?= get_pagenum_link($paged - 1) ?>" class="pagination-arrow arrow left arrow-left prev"></a>
                <?php }

                ?><div class="wrapper articles">
                    <?php 
                    while($query->have_posts()): $query->the_post(); ?>

                    <article class="crochelou-card blog">
                        <div class="blog image" style="background-image: url('<?=esc_url(the_post_thumbnail_url('medium'))  ?>')"></div>
                        <div class="categories"><?php
                            $categories = get_the_category();
                             foreach($categories as $category){ 
                                 $name = $category->name;
                                 $link = get_category_link($category->term_id); ?>
                                 <a href="<?= $link ?>" class="catgory"><?= $name ?></a>
                            <?php
                             }
                        ?></div>
                        <span class="date"><?= get_the_date('d') . '\\' . get_the_date('m') . '\\' . get_the_date('Y') ?></span>
                        <h4 class="headline blog"><a href="<?= get_the_permalink() ?>"><?= get_the_title() ?></a></h4>
                        <div class="perex excerpt"><?php the_excerpt(); ?></div>
                        <a class="link read-more" href="<?= get_the_permalink() ?>" >číst..</a>
                    </article>



                    <?php endwhile;
                    ?>
                </div><?php
                if($paged < $query->max_num_pages){ ?>
                    <a href="<?= get_pagenum_link($paged + 1) ?>" class="pagination-arrow arrow right arrow-right right"></a>
                <?php }

                ?>
            </section>



                <?php if($paged < $query->max_num_pages){  ?>
                    <div id="blog-pagination">
                        <nav class="pagination">
                            <ul>
                                <?php 
                                for($i=1; $i <= $query->max_num_pages; $i++){

                                    if($i === $paged){ ?>

                                    <span class="current"><?= $i ?><?php if($i < $query->max_num_pages){ echo ','; } ?></span>

                                    <?php }else{ ?>

                                    <a href="<?= get_pagenum_link($i) ?>"><?= $i ?><?php if($i < $query->max_num_pages){ echo ','; } ?></a>

                                    <?php }

                                }
                                ?>
                            </ul>
                        </nav>
                    </div>
               <?php     }       


            ?>
            <!-- THIS WILL JUST RENDER 'ABOUT ME' TEST FROM ADMINISTRATION -->
            <div class="separator"></div>
            <?php $page = get_page_by_path( 'o-mne' ); ?>
            <article id="about">
                <h3 class="title"><?= $page->post_title ?></h3>
                <?php 
                $content = $page->post_content;
                $content = apply_filters('the_content', $content);
                $content = str_replace(']]>', ']]&gt;', $content);
                ?>
                <div id="about-content"><?= $content ?></div>
            </article>



        </section>
    </main><!-- #main -->
</div><!-- #primary -->
1
Jan Šimerda

Vous n'obtiendrez pas un 404 car WP peut trouver la page, puis il délègue la demande au fichier de modèle dans lequel vous avez ajouté votre propre logique.

Vous pouvez créer votre propre traitement 404 dans ce fichier, mais une meilleure solution consiste à utiliser le fichier archive.php (ou archive-post.php pour ce type de message uniquement) afin de restituer la sortie et à utiliser le fichier action pre_get_posts pour manipuler le WP_Query utilisé pour rechercher des publications (personnaliser la taille de la page). Si vous procédez ainsi, vous constaterez que WP déclenchera un 404 correctement si la page demandée est supérieure à la dernière page disponible.

1
janh