サポート » 使い方全般 » ページネーションがうまく動作しません。

  • 解決済 katsu0999

    (@katsu0999)


    ご覧いただき誠にありがとうございます。
    タイトルにありますようにページネーションがうまく動作せず大変困っております。

    事例ページにて最初の3件とそれ以外の古い記事のデザインが異なるためoffsetを使用しております。
    それが以下の記述になります。

    
    <?php if ( !is_paged() ) : // 1ページ目 ?>
    <?php query_posts(‘post_type=voice&posts_per_page=3’); ?>
    <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
    <div class=””></div>
    <?php endwhile; endif; ?>
    <?php else : // 2ページ目以降 ?>
    <?php endif; ?>
    
    <ul id=””>
    <?php if (have_posts()) : ?>
    <?php
    $paged = get_query_var(‘paged’) ? get_query_var(‘paged’) : 1 ;
    $perpage = get_option(‘posts_per_page’);
    $offset = ($paged – 1) * $perpage + 3;
    query_posts(“showposts=$perpage&offset=$offset&paged=$page&post_type=voice”);
    ?>
    <?php while (have_posts()) : the_post(); ?>
    <?php endwhile; ?>
    
    <div class=”tablenav”><?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,
    ‘prev_text’ => __(‘前のページ’),
    ‘next_text’ => __(‘次のページ’),
    ‘total’ => $wp_query->max_num_pages,
    ‘mid_size’ => 5,
    ‘current’ => ($paged ? $paged : 1),
    )); ?></div>
    <?php else : ?>
    <?php endif; ?>
    

    この状態で確認したところ記事がないのにも関わらず表示しなければいけないページ数の+1でページネーションが生成されます。(3件目はないのにページネーションは3まである)
    お客様のほうで更新を行っており、3つ程下書き保存したものは見受けられました。
    下書き保存されているものはページの生成になにか影響があるのでしょうか?
    いろいろ検索を行ったのですが、解決策が見つかりませんでした。

    うまくお伝えできているか不安ではありますがご教授いただけると幸いです。
    よろしくお願い致します。

    • このトピックは katsu0999が6 ヶ月前に変更しました。
    • このトピックは katsu0999が6 ヶ月前に変更しました。
    • このトピックは katsu0999が6 ヶ月前に変更しました。
8件の返信を表示中 - 1 - 8件目 (全8件中)
  • Mirucon

    (@mirucon)

    pageginate_links() の引数の mid_size の数を5より小さい数にしてみてはどうでしょう ?

    返信ありがとうございます。
    先ほどmid_sizeを5から2に変更してみましたが変わらずでした…
    本来下書き保存している記事がカウントされることはあるのでしょうか?

    下書きがカウントされることはないです。データベースから取ってきたデータでページネーションを組んでるならともかく、paginate_links ではカウントされないですね。

    これは単純に paginate_links が最初に表示される3つの投稿分を抜かして考えていないだけだと思います。

    ちょっと僕 query_posts って関数の動きよく知らないので WP_Query で考えると、

    $args = array(
    	'posts_per_page' => 5,
    	'paged' => $paged,
    );
    
    $the_query = new WP_Query( $args );
    

    みたいなクエリに対しては paginate_links()total の引数に $the_query-> max_num_pages を指定すればそのカスタムクエリに対してのページネーションが出来上がります。

    せっかくなので new WP_Query、もしくは get_posts() でループを書き直してみてはどうでしょう ?

    • この返信は5 ヶ月、 4 週間前に  Mirucon さんが編集しました。

    ご返答、誠にありがとうございます。
    先ほど下書き保存されている記事を公開したところ次は4件目のページネーションが表示されました。
    おそらくmirucon様のおっしゃるようにoffsetで省いてるはずの3件が省かれていないことが明確になりました。
    ループの書き直しがやはりはやいでしょうか…
    再度検討してみます m(_ _)m

    あともう一点お聞きしたいのですが、

    
    <ul id=””>
    <?php if (have_posts()) : ?>
    <?php
    $paged = get_query_var(‘paged’) ? get_query_var(‘paged’) : 1 ;
    $perpage = get_option(‘posts_per_page’);
    $offset = ($paged – 1) * $perpage + 3;
    query_posts(“showposts=$perpage&offset=$offset&paged=$page&post_type=voice”);
    ?>
    <?php while (have_posts()) : the_post(); ?>
    <?php endwhile; ?>
    </ul>
    

    上記のコードで1ページ目はオフセットで記事4件目から表示したまま、
    2ページ以降オフセットを解除する場合の条件分岐の記述方法を教えていただけないでしょうか…?
    いろいろとアドバイスをいただいているにも関わらず図々しい返答お許しください。

    query_posts はそもそもプラグインやテーマで使用されることが想定されているものでなく、ページネーション関連での不安定な動作が見られることが多いです。

    なので、if ( ! is_paged() ) でまず1ページ目にのみ表示される場所に、WP_Query の post__in で最初のループを組み、その後もう一つの WP_Query の post__not_in で最初のループに表示された記事を除外したもう一つのループを組む、みたいな感じな実装が1番だと思います。イメージ伝わりますかね? 時間があればサンプルとしてコード書いてみます。

    • この返信は5 ヶ月、 4 週間前に  Mirucon さんが編集しました。

    こんな感じで動きます ?

    $recents = wp_get_recent_posts([
    	'numberposts' => 3,
    ]);
    $ids     = [];
    foreach ( $recents as $post ) {
    	array_push( $ids, $post['ID'] );
    }
    
    if ( ! is_paged() ) {
    
    	$first_query = new WP_Query([
    		'post__in'            => $ids,
    		'ignore_sticky_posts' => true,
    	]);
    
    	if ( $first_query->have_posts() ) {
    		while ( $first_query->have_posts() ) {
    			$first_query->the_post();
    			// なにか
    		}
    	}
    
    	wp_reset_postdata();
    }
    
    $the_query = new WP_Query([
    	'post__not_in' => $ids,
    	'paged'        => $paged,
    ]);
    
    if ( $the_query->have_posts() ) {
    	while ( $the_query->have_posts() ) {
    		$the_query->the_post();
    		// なにか
    	}
    }
    
    wp_reset_postdata();
    
    the_posts_pagination([
    	'type'              => 'list',
    	'end_size'          => '2',
    	'mid_size'          => '3',
    	'current'           => max( 1, get_query_var( 'paged' ) ),
    	'total'             => $the_query->max_num_pages,
    	'prev_text'         => '&laquo;',
    	'next_text'         => '&raquo;',
    	'after_page_number' => '',
    ]);
    

    自己解決しました。

8件の返信を表示中 - 1 - 8件目 (全8件中)
  • このトピックに返信するにはログインが必要です。