web-dev-qa-db-ja.com

Front-page.phpと共に使用すると、ページ付けをするとエラー404が発生する

私はfront-page.phpを作成しています。このページには最新の特集記事が表示され、前の注目記事に移動するためのページ付けオプションもあります。

以下のようにフロントページのコードを書きました。

$args = array();
$args['post_type'] = 'post';
$args['post_status'] = 'publish';
$args['category_name'] = 'featured';
$args['posts_per_page'] = 4
$args['paged'] = (get_query_var('page')) ? get_query_var('page') : 1;

$the_query = new WP_Query($args);

if ($the_query->have_posts()) {

    while ($the_query->have_posts()) {

        $the_query->the_post() ;
        the_title();

    } // End of: while ($the_query->have_posts())

    next_posts_link('Next', $the_query->max_num_pages );
    previous_posts_link('Previous');

} // End of: if ($the_query->have_posts())

そのため、サイトのフロントページ(mysite.devページなど)に移動すると、ページは正しく表示されます。

さて、Nextリンクをクリックすると、URLはmysite.dev/page/2になりますが、404の2ページ目の代わりにfront-page.phpページが返されます。

私は約5〜6時間を過ごしました。この問題についてはほぼ一件の記事を読んでください。

1
Greeso

編集

あなたのコメントから、front-page.phpはページが静的フロントページとして設定されている場合にのみ使用されます。通常のホームページ、つまりフロントページにに設定されている場合、最新の投稿index.phpが使用されます。

すべてのアーカイブページとフロントページはpagedではなくpageを使用するので、get_query_var( 'page' )get_query_var( 'paged' )に設定する必要があります。

いずれにせよ、あなたはあなたのホームページでカスタムクエリを使うべきではありません、あなたはあなたのニーズに主なクエリを変えるためにpre_get_postsを使うべきです

add_action( 'pre_get_posts', function ( $q )
{
    if (    $q->is_home()
         && $q->is_main_query()
    ) {
        $q->set( 'category_name',  'featured' );
        $q->set( 'posts_per_page', 4          );
    }
});

ページネーションのリンクは

next_posts_link( 'Next' );
previous_posts_link( 'Previous' );

index.php内のループはこのようになります。

if ( have_posts() ) {
    while ( have_posts() ) {
        the_post();

           // Your markup and template tags

    }
}

もしあなたが本当にfront-page.phpを静的なフロントページではなく通常のホームページとして使う必要があるなら、あなたは以下をする必要があります。

  • ページ付けリンクを使用して、ループを上記で提案したものに変更します。

  • 上記のようにpre_get_postsを使用して、必要に応じてメインクエリを変更します。

  • ホームページテンプレートとしてhome_templateを使用するには、front-page.phpフィルタを使用します

あなたは以下を試すことができます

add_filter( 'home_template', function ( $template )
{
    $locate_template = locate_template( 'front-page.php' );

    if ( !$locate_template )
        return $template;

    return $locate_template;
});

もともとの答え

関数next_posts_link()previous_posts_link()は、箱から出してすぐの静的フロントページでは動作しません。問題は、ページネーションは$pagedグローバルに保存されているget_query_var( 'paged' )を使用することです。静的フロントページはget_query_var( 'page' )ではなくget_query_var( 'paged' )を使用しているので、あなたのリンクは過去のページ1を決してページ付けしません。

グローバルな$pagednext_posts_link()に設定することで、アーカイブページでそれらが使われていると考えるためにprevious_posts_link()get_query_var( 'page' )をだますことができます。

あなたは以下を試すことができます

$paged                   = get_query_var( 'page', 1 ); 
$args                    = [];
$args['post_type']       = 'post';
$args['post_status']     = 'publish';
$args['category_name']   = 'featured';
$args['posts_per_page']  = 4;
$args['paged']           = $paged;

$the_query = new WP_Query($args);

if ($the_query->have_posts()) {

    while ($the_query->have_posts()) {

        $the_query->the_post() ;
        the_title();

    } // End of: while ($the_query->have_posts())

    next_posts_link('Next', $the_query->max_num_pages );
    previous_posts_link('Previous');

    wp_reset_postdata(); // VERY VERY IMPORTANT

} // End of: if ($the_query->have_posts())

編集

あなたはまたあなたの静的フロントページで以下を利用することができます。

$query = new PreGetPostsForPages(
    251,       // Page ID we will target, your static front page ID
    'content', //Template part which will be used to display posts, name should be without .php extension 
    false,     // Should get_template_part support post formats
    true,      // Should the page object be excluded from the loop
    [          // Array of valid arguments that will be passed to WP_Query/pre_get_posts
        'post_type'      => 'post', 
        'category_name'  => 'featured',
        'posts_per_page' => 4
    ] 
);
$query->init(); 

PreGetPostsForPagesクラスは/でサポートされています ここに私の答え

add_action( 'pregetgostsforgages_after_loop_pagination', function ()
{
    $paged = get_query_var( 'page', 1 );
    next_posts_link( 'Next' );
    previous_posts_link( 'Previous' );
});
4
Pieter Goosen