質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.10%

ワードプレスでのページネーション機能の実装について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 769

php_shosinsha

score 15

現在トップページに写真を呼び出すようにPHPで構築してあります。
その中で40枚ある写真(今後も増加予定)を30枚出たところで区切り、ページングさせたいと思っています。

しかし、下記コードでは30枚目ではなく26枚目で区切られてしまい、
残りの14枚も次のページには表示されず、1枚目と同じ26枚が表示されています。

また、 'posts_per_page'=>100 にして全写真を1枚目に表示させても
ページ件数が必ず“ 1 2 3 次へ ”と3ページ表示されます。
その場合も次ページには1枚目と同じ写真が表示されています。

※修正後、写真が繰り返されるのはなくなりましたが、次はページ数が多くなってしまうようになりました。
例えば、2ページが正しい枚数のところ3ページあるように表示されてしまい、3ページ目には写真がないことをあらわすエラーが出てきます。

コードで直すべきところがありましたら、ご教授ください。
参考にしたサイトはhttp://appakumaturi.hatenablog.com/entry/20110528/1306585716です。
よろしくお願い致します。

▼home.php

<?php $reco_ob = new wp_query(array('cat'=>'2', 'posts_per_page'=>30, 'post_status'=>'publish','order'=>'DESC','orderby'=>'ID')); ?>
<?php if ($reco_ob->have_posts()) : while ($reco_ob->have_posts()) : $reco_ob->the_post(); usces_the_item(); ?>
<?php if (usces_is_skus()) : ?>

(その他コード)

<?php global $wp_rewrite;
$paginate_base = get_pagenum_link(1);
if(strpos($paginate_base, '?') || ! 
  $wp_rewrite->using_permalinks()){
  $paginate_format = '';
  $paginate_base = add_query_arg('paged','%#%');
}
  else{
$paginate_format = (substr($paginate_base,-1,1) == '/' ? '' : '/') .                user_trailingslashit('page/%#%/','paged');;
$paginate_base .= '%_%';
}
  echo paginate_links(array(
    'base' => $paginate_base,
    'format' => $paginate_format,
    'total' => $wp_query->max_num_pages,
    'mid_size' => 4,
    'current' => ($paged ? $paged : 1),
    'prev_text' => '«',
    'next_text' => '»',
)); ?>

▼functions.php

<?php
function my_paginate(){
    global $wp_query, $paged;
    $p_base = get_pagenum_link(1);
    $p_format = 'page/%#%';
    //?の有無確認、有る場合は場所を特定
    if($word = strpos($p_base, '?')){
    //?がある場合(検索結果)
        $p_base = get_option(home).(substr(get_option(home), -1 ,1) === '/' ? '' : '/')
        .'%_%'.substr($p_base, $word);
    } else{
    //?が無い場合(カテゴリ、タグ等)
        $p_base .= (substr($p_base, -1 ,1) === '/' ? '' : '/') .'%_%';
    }
    echo paginate_links(array(
        'base' => $p_base,
        'format' => $p_format,
        'total' => $wp_query->max_num_pages,
        'current' => ($paged ? $paged : 1),
        )); 
}
?>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • igaiga

    2017/05/12 13:45

    $pagedって値入ってますか?($paged ? $paged : 1)で値がないから1が入っている状態じゃないですかね?

    キャンセル

  • php_shosinsha

    2017/05/15 13:52

    functions.phpにいれていた($paged ? $paged : 1)が機能していなかったようで、home.phpのコードを書き換えたところ、繰り返すバグはなくなりました。

    キャンセル

  • php_shosinsha

    2017/05/15 13:54

    ただなぜかページ数が多くなっており、2ページでいいところが3ページになっていたりします。

    キャンセル

回答 1

checkベストアンサー

+1

  1. new wp_query の引数がページングを考慮していない
  2. my_paginate が $reco_ob ではなくメインクエリを基準としてページングをしようとしている

なのでページテンプレート上で new wp_query せずに、functions.php上で pre_get_posts 使った書き方に書き直すほうが良いと思います。

【【wordpress】pre_get_postsを使ってみませんか? - Qiita】
http://qiita.com/_ruka_/items/e14280d34eddf49efad1

【[Wordpress]pre_get_postsを使いこなす!pre_get_posts使い方まとめ | EMiAC-Works】
https://emiac-works.com/coding/pre-get-posts-code-snipet/

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/15 17:14

    ひとつ質問なのですが、とあるページでは30枚表示、また別のカテゴリーでは15枚というような場合もfunctions.phpに書いた方が良いでしょうか?

    キャンセル

  • 2017/05/15 17:35

    > とあるページでは30枚表示、また別のカテゴリーでは15枚というような場合もfunctions.phpに書いた方が良いでしょうか?

    そうですね。pre_get_postsフックで実行する関数内でカテゴリなどの分岐が出来るので、まとめて書くことも可能です。

    キャンセル

  • 2017/05/16 14:58

    ありがとうございます!無事に解決することができました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる