【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】プラグイン化したカスタム投稿をテーマ内で使うとき

通常テーマ内でカスタム投稿を表示させる時に

$args = array( "posts_per_page" => 5,
        "post_type" => 'news'
    );
$the_query = new WP_Query( $args );
if($posts):

と書けば表示されるのに、プラグイン化していたので表示されなかった話。

 

functions.phpでカスタム投稿を追加している場合は必要ないが、newsというカスタム投稿をプラグイン化していたので、以下の記述が必要でした。

    public function __construct() {
        add_action( 'pre_get_posts', array($this, 'add_my_post_types_to_query') );
    }

    // queryにnewsをセットする
    function add_my_post_types_to_query( $query ) {
        if ( is_home() && $query->is_main_query() )
            $query->set( 'post_type', array( 'post', 'page', 'news' ) );
        return $query;
    }

WordPressプラグインの作り方は、また後日ちゃんとした記事にしたいと思ってます。今回はとりあえず忘れそうなのでメモだけで失礼。

WordPress

WordPressで抜粋の語尾が文字化けするときメモ

以下の記事にて解決。ありがとうございます。

the_excerpt() で表示される &nbsp | Web Design Leaves

 

改行コード等についてのみ触れられていますが、

こういう文字化けにも対応可能でした。

仕事で使ったけれどこのブログにも対応せねばメモ。

WordPress

wordmove+ロリポップうまくいかないときメモ

無駄に2回も同じことでハマった。くそう。

rsyncがうまくいかない

ssh接続でrsyncがどうのっていうエラーが出た時

rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [sender=3.1.0]

権限がおかしい(が自分はどこの権限がおかしいのかよくわかっていない)のだが

ロリポに SSH で公開鍵接続して rsync でサーバー同期をしてみる – IMPOV::In My Point Of View

で公開鍵接続の設定をするとなんか上手くいく(パスワード接続できない→鍵生成・配置→パスワード接続できるようになる。実際には鍵使わずパスワード認証してるのになんでだろう)

 

子ページが404になる

ロリポップサーバーでサブディレクトリを変更して記事が404エラーになる場合の対処法

まさにこれで、WordPressのパーマリンク設定を開いて保存を押すだけで直る。

 

でもこのメモ見る機会なければいいなぁとは思う。

WordPress

【bbpress】管理者以外で投稿時にhtmlが反映されないときの対処【wordpress】

管理者以外で用意した投稿フォームから投稿してもhtmlタグが変換されない。

bbpressがそういう仕様ではあるのだが、それでもhtmlを使いたい場合。

Topic: Allowing Participants to post “unrestricted HTML” · bbPress.org

このスレの一番下より

WordPressにUser Role Editorというプラグインを導入。

指定したユーザにunfiltered_htmlを割り振る。

ユーザを全て管理者にするよりはいいはず。

WordPress
more