query_postsを使っているのでページ送りがうまくいかないのだと思います。
最近のおすすめはpre_get_postsというアクションフックを用いることで、
query_postsを使わずにメインクエリ(この場合はカテゴリー毎に表示件数を変える)の改変が可能です。
これはテンプレートファイルにアクセスする前にクエリを改変しますので、
二重にクエリの呼び出しを行わなくて済むというメリットがあります。
Codex:is_main_query
こちらのブログでは「カテゴリーアーカイブだったら表示する件数を5件にする」と言うコードが紹介されています。
3.3の新しい関数 is_main_query を使おう
※3.3となっていますが、3.2以前でも対応可能なコードが紹介されています。
いったんテンプレートを元に戻して
テーマのfunctions.phpにこちらのコードを書いてみてください。
未検証ですが、
index.phpということで、今回は「フロントページの場合」として例示しますが、
条件分岐タグを使えば、他の場合でも使えます。
function mont_posts_per_page( $wp_query ) {
if (!is_admin()) { //管理画面以外で
if ( $wp_query->is_main_query() && $wp_query-> is_front_page() ) { // // メインクエリーがホーム(フロントページ)
$wp_query->set( 'cat', -1 ); // カテゴリーID = 1 を除外
$wp_query->set( 'posts_per_page', 10 ); // 10件ずつ
}
}
}
add_action( 'pre_get_posts', 'mont_posts_per_page' );
他のスレッドでも条件が異なりますが、同様のコードを紹介しています。
「月内の書き込みを全部表示させたい」
「wp-pagenaviを使用し、カテゴリごとに記事数を変更したい」
こんにちは
query_postsを使っているのでページ送りがうまくいかないのだと思います。
という事ではないと思います。
yua0209さんが、最初に示されたコードも、gatespaceさんが「未検証ですが、」として示されたコードも、どちらも動作すると思います
cat=-1は、普通なら、アンカテゴライズにチェックが入っていない投稿ということになるので、もともと、yua0209さんがテストしておられるブログの投稿が、少ないのではないかと想像していますが、cat=-1をはずしてもページ送りが出来ないですか?
twentyelevenのindex.php get_header()直後にコピペして動作確認したコードです。
<?php
if( is_main_query() ){
$paged= get_query_var('paged');
query_posts("cat=-1&posts_per_page=3&paged=$paged");
}
if( ! is_main_query() ){
echo '<p style="text-align:center;">Not main query</p>';
}
?>
<div style="margin:50px;">
<?php if( have_posts() ){?>
<?php while ( have_posts() ) : the_post(); ?>
<?php get_template_part( 'content', get_post_format() ); ?>
<?php endwhile; }?>
<?php posts_nav_link(' | ','≪','≫'); ?></div>
<?php wp_reset_query(); ?>
<?php
wp_reset_query();
if( is_main_query() ){
echo '<p style="text-align:center;">main query</p>';
}
?>
件数がそんなにないので、3件に変更しましたけど、動作しているようでした。
gatespaceさま、nobitaさま、ありがとうございます。
cat=-1をはずし、
<?php
$paged = get_query_var('paged');
query_posts('posts_per_page=10&paged='. $paged);
?>
現在このコードになりましたが、変わらないままです。
また、nobitaさんがおっしゃる通り、まだ運営を始めたばかりで記事は少ないです。
社内で運用しているブログで、公開後にこのバグ?に気づいたため、
gatespaceさんのおっしゃるテンプレートを元に戻すというのが困難なのですが、
仮の環境をつくってやってみます。
ちなみに、実はindex.php内であと2つquery_postsを使っています。
loop.php内でリセットタグをいれてるのはこのためなのですが、
ページ送りができないのはこれが関係していたりするのでしょうか…。
※loop.phpより上の部分に、カスタム投稿タイプで作ったお知らせ情報をいれる以下の2つがあります。
<?php query_posts('post_type=info&posts_per_page=1'); ?>
<?php if(have_posts()) : while(have_posts()) :the_post(); ?>
<?php the_content(); ?>
<?php endwhile;endif; ?>
<?php wp_reset_postdata(); ?>
<?php query_posts('post_type=topnews&posts_per_page=1'); ?>
<?php if(have_posts()) : while(have_posts()) :the_post(); ?>
<?php the_content(); ?>
<?php endwhile;endif; ?>
<?php wp_reset_postdata(); ?>
失礼しました。慌てて、nobitaさんが検証してくださったコードを試さずにレスを投稿してしまいました。
挑戦してみて、またご報告します。ありがとうございます!
こんにちは
その状態ですと、私の書いたコードは、動作しないと思います。
ちなみに、実はindex.php内であと2つquery_postsを使っています。
wp_reset_postdata() を、wp_reset_query() に変更してみてください
それから、コードをテストしてみてください。
wp_reset_postdata() を、wp_reset_query() に変更してみてください
ためしたところ、正常に動作しました!!ありがとうございます!!
ためしに、条件にcat=-1を追加しても問題なく動作できました。
リセットタグが間違っていることはわかっていたのですが、
制作中の動作確認で、wp_reset_query()にすると
なぜかカスタム投稿のすべて表示されるという現象が起きていたので
よくわからないままpostdataにしておりました・・・
今なぜ正常になったのかもわかっていませんが、勉強します。
新しい関数という is_main_query についても勉強します。
お二人とも、ありがとうございました!
余談ですが、このリセットタグを修正することにより、
実はもうひとつの悩みのタネであった
≪次の5件 | 前の5件≫ が ≪次の5件前の5件≫ と表示されてしまう
というバグも直りました。
ありがとうございました。