web-dev-qa-db-ja.com

paged> max_num_pagesは404をスローしません

BlogというWP管理で新しいページを作成し、それ用のカスタムページテンプレートを作成しました。テンプレートには、簡単なページカスタムクエリがあります。

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

私が手動でurlの '/ page /'の部分の後に利用可能であるより大きいページ番号をタイプするときを除いて、すべてが問題ないように見えます。ページは404エラーをスローしませんが、カスタムループなしでページを通常どおりにレンダリングします。それは正常な動作ですか?もしそうなら、どのように私は404テンプレートページを投げるべきですか?

また、1つ質問があります。

Wordpress管理でページを作成する必要なしに、カスタムテーマページを作成することは可能ですか?ほとんどの場合、私はページのコンテンツさえも使わず、空のままにします。その後、誰かがそのページを削除したり、ページのスラッグを変更したりすると、Webサイトの一部が破損する可能性があります。

もっと愚かな証拠ともっと管理者に優しい解決策はありますか?

シモンズ:これは完全な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

WPはページを見つけることができるので404は表示されません。そして、それはあなたがあなた自身のロジックを追加したテンプレートファイルにリクエストを委任します。

そのファイルに独自の404処理を構築することもできますが、より良い方法は、出力をレンダリングするためにarchive.php(まさにこの投稿タイプの場合はarchive-post.php)を使用し、 投稿を見つけるために使用されるWP_Queryを操作するためのpre_get_postsアクション (ページサイズのカスタマイズ)。そのようにしているなら、要求されたページが最後の利用可能なページより大きければWPは404を正しくトリガーするでしょう。

1
janh