【WordPress】フロントページと2ページ目以降で記事数を変更するとnext_posts_link()が正しく表示されなくなった話。

どうも。Reoです。

WordPressでfront-pageに最新記事一覧を載せている時に、1ページ目(トップページ)と2ページ目以降で表示する記事数を変えよう〜というお話です。

1ページ目と2ページ目以降で表示する記事数を変える方法自体は調べればどんだけでも出てきます。

が!

古い記事を表示するためのnext_posts_link()がうまく動かなくて、結構数時間くらい調べないと解決しなかったのでせっかくなので記事書いておきます。

 

1ページ目と2ページ目以降で表示する記事数を変更する。

まずはfunctions.phpに

//1ページ目と2ページ目で表示する記事数を変える
define('PAGE_1ST', 5);  //1ページ目の記事数
define('PAGE_2ND', 10); //2ページ目の記事数
function change_posts_paging( $query ) {
  if ( is_admin() || !is_front_page() ){
    return; //フロントページでのみ動作
  }
  //現在のページを取得
  $paged = get_query_var( 'paged' ) ? intval( get_query_var( 'paged' ) ) : 1;
  if ($paged >= 2){ //2ページ目以降の時
    $query->set('offset', PAGE_1ST + PAGE_2ND*($paged-2));
    $query->set( 'posts_per_page', PAGE_2ND);
  }else {   //1ページ目の時
    $query->set( 'posts_per_page', PAGE_1ST );
  }
}
add_action( 'pre_get_posts', 'change_posts_paging' );

と書きます。

2ページ目以降の記事数を管理画面で設定した記事数にする場合は

define('PAGE_2ND', get_option( 'posts_per_page' )); //2ページ目の記事数

としてあげればおkです。

 

if文の書き方は色々あれど、大抵このようにして記事数を変更しています。

んで、どこの記事を見てもこれでおk!としているんですが、これだとnext_posts_link()がうまく動かないんですよね。

 

next_posts_link()がうまく動いていない

例えば57件の記事を、1ページ目に5件、2ページ目以降は10件表示する設定にしていた場合。

1ページ目は5件表示。next_posts_link()で次ページへの表示も出る。

問題は5ページ目です。

55件を表示した時点で、next_posts_link()での次ページへの表記が表示されなくなります。

残り2件が表示されないんですね。

リンクに~~/page/6としてみると記事自体は表示することができます。(404にはならない)

 

どうやらnext_posts_link()自体は10件ずつ表示されてる体で動作しているっぽい。。。

 

next_posts_link()を正しく動作させるには

さてさて解決方法です。結構見つけるまで苦労しました。

functions.phpに

function found_offset( $found_posts, $query ) {
    $offset = PAGE_1ST;

    if( !is_admin() && $query->is_main_query() ) {
        $found_posts = $found_posts + $offset;
    }
    return $found_posts;
}
add_action( 'found_posts', 'found_offset', 10, 2 );

を追加。

これで5ページ目でも次ページへのリンクが表示されます。1番最初の投稿記事までちゃんと見れます。やったね!

 

ちなみにこの記事を書いている現在のうるおいらんど、これがないので1番最初の記事まで遡れません。数年間そうだったみたい。

ブログリニューアル後はちゃんとしているのでそれまでは見逃してやってください。

 

全体コード

これをコピペしてfunctions.phpに追記すればおk!

//1ページ目と2ページ目で表示する記事数を変える
define('PAGE_1ST', 5);  //1ページ目の記事数
define('PAGE_2ND', get_option( 'posts_per_page' )); //2ページ目の記事数
function change_posts_paging( $query ) {
  if ( is_admin() || !is_front_page() ){
    return; //フロントページでのみ動作
  }
  //現在のページを取得
  $paged = get_query_var( 'paged' ) ? intval( get_query_var( 'paged' ) ) : 1;
  if ($paged >= 2){ //2ページ目以降の時
    $query->set('offset', PAGE_1ST + PAGE_2ND*($paged-2));
    $query->set( 'posts_per_page', PAGE_2ND);
  }else {   //1ページ目の時
    $query->set( 'posts_per_page', PAGE_1ST );
  }
}
add_action( 'pre_get_posts', 'change_posts_paging' );

//next_pages_link()を正しく動かす
function found_offset( $found_posts, $query ) {

    $offset = PAGE_1ST;

    if( !is_admin() && $query->is_main_query() ) {
        $found_posts = $found_posts + $offset;
    }
    return $found_posts;
}
add_action( 'found_posts', 'found_offset', 10, 2 );

 

wordpressでフロントページ記事数とそれ以降の記事数を変更しているあなた。もしかすると最後まで表示されてないかもしれないですぞっ。

既に似たような実装をした記憶がある方は要チェックですよ!

私は2年気づかずに放置していたからね!!!!!

 

それではでは。

 

WordPress
コメントは認証制です。詳しくは下記の注意をお読みください。お気軽にコメントお願いします!

Write a Comment

コメント時の注意

「Twitter」「Facebook」「Google+」「WordPress」のいずれかのアカウントをお持ちの方は各アカウントと連携することでコメントできます。 コメントしたことはSNSに流れませんので、アカウントをお持ちの方はこちらの方法でコメントを投稿して下さると嬉しいです。 アカウントをお持ちでない方はメールアドレスで投稿することができます。 初回コメント時は承認後に表示されます。

Related Memo...

WordPressで現在のカテゴリから親カテゴリ/祖先カテゴリのスラッグを取得

//現在のカテゴリを取得
$categories = get_the_category($post->ID);
$category_slugs = array();
foreach($categories as $category){
    $cat = $category;
    array_push($category_slugs,$cat->slug);
    //親のカテゴリがなくなるまで回す
    while ($cat->parent) {
        $cat_parent_id = $cat->parent;
        $cat = get_category($cat_parent_id);
        array_push($category_slugs,$cat->slug);
    }
}

わりと頑張ってPHP書いてる。

WordPress
more