おそらく、
<?php query_posts(“posts_per_page=5&paged=$paged”); ?>
で設定されている5件の数より管理画面の[設定]→[表示設定]→「1ページに表示する最大投稿数」の件数のほうが大きい設定にされているのだと思います。
ネットにある解決策だと管理画面の「1ページに表示する最大投稿数」の数を「1」最小の数にすると動作するようですが、そうなると他のアーカイブページも1件表示になってしまい、アーカイブのテンプレートが複数ある場合、修正作業が大変かと思います。
ページネーションをさせたい場合かつ、表示件数を管理画面の「1ページに表示する最大投稿数」で設定した数とは異なる件数にしたい場合は、以下のトピックスでjim912さんが記載されているように「posts_per_page」を利用されるのが良いかと思います。
http://ja.forums.wordpress.org/topic/11147?replies=15
>tkc49さん
ご指摘されたページのとおりにソースを書きましたら、PAgeNavi,投稿記事の表示共に消えてしまったので、ひとまず以前のソースに戻している状態です。
試してみて表示が消えてしまったのは以下のソースです。
<div id="contents_w">
<div id="main">
<?php $paged = (get_query_var('page'))?get_query_var('page'):1; ?>
<?php $args = array(
'post_type' => array('antiaging','house','marriage','family','town','try'),
'paged' => $paged,
'posts_per_page'=>8
); ?>
<?php query_posts($args); ?>
</div><!-- /#main -->
<?php wp_pagenavi(); ?>
</div>
<?php get_footer(); ?>
ところで、基本的なことが理解できていないのかもしれませんが、複数の投稿記事を固定ページに表示させるにはarchive.phpが必要でしょうか?
はじめに質問した時点ではなくとも(表示はおかしいものの)複数の投稿記事が固定ページトップだけには表示されていたのですが、必要なのかな?と思い、調べてコピペしたものを以下のように作成しました。
<div id="contents">
<h2><?php wp_title(); ?></h2>
<?php if ( have_posts()): ?>
<ul>
<?php while ( have_posts() ) : the_post(); ?>
<li>
<p>
<span>日付:<a href="<?php the_permalink(); ?>"><time datetime="<?php the_time('y-m-d'); ?>"><?php the_time( get_option('date_format') ); ?></a></span>
</p>
<a href="<?php the_permalink(); ?>">
<?php if ( has_post_thumbnail() ) :
the_post_thumbnail('thumbnail');
else :
echo '<img src="';
bloginfo( 'template_url' );
echo '/images/the_post_thumbnail_default.png" alt="デフォルト画像" />';
endif; ?>
</a>
<h3><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></h3>
<p>
<?php the_excerpt(); ?>
</p>
<p>
<span>カテゴリー:<?php the_category(','); ?></span>
<span><?php the_tags(); ?></span>
</p>
</li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
</div>
archive.phpを作成しても、以前のソースの方で試しても、全く同じ表示でした。
初心者なのですが、勉強のためにオリジナルでテーマを作成していて、その都度必要なファイルを作成しています。何が原因なのでしょうか?
サイトを検索して色々試したのですが、やはり問題が残るのは、2ページ目以降のリンク先に飛ぶと、トップの表示になってしまうということです。アドレスは、/page2/となっています。
現在の固定ページのソースです。
<?php query_posts('posts_per_page=5&paged='.$paged); ?>
<ul>
<?php if(have_posts()): while(have_posts()): the_post(); ?>
<li><?php the_content(); ?></li>
<?php endwhile; endif; ?>
</ul>
<?php if(function_exists('wp_pagenavi')) { wp_pagenavi(); } ?>
<?php wp_reset_query(); ?>
archive.php はアーカイブで使うのに、こんなコードがまじっていていいのでしょうか? 普通に固定ページ用のテンプレート page.php または page-なんとか.php の方がよくないですかねぇ。
query_posts() については、新旧さまざなページが検索でヒットすると思いますが、記事の日付に注意されるのがよいと思います。WP-PageNavi についても同様です。
それはさておき、wp_pagenavi() は引数にクエリオブジェクトをとれますので、下のように、WP_Query を使うと、どうなりますか?
<?php
$args = array(
'posts_per_page' => 5,
'paged' => get_query_var('paged'),
);
$the_query = new WP_Query($args);
?>
<ul>
<?php if($the_query->have_posts()): ?>
<?php while($the_query->have_posts()): $the_query->the_post(); ?>
<li><?php the_content(); ?></li>
<?php endwhile; endif; ?>
</ul>
<?php if(function_exists('wp_pagenavi')) { wp_pagenavi(array('query' => $the_query)); } ?>
<?php wp_reset_postdata(); ?>
カスタム投稿タイプが複数あって、それを1ページに表示したいとか、固定ページ自体のコンテンツがあって、それに加えて投稿リストを表示したいとかいうのでなければ、pre_get_posts フックを使った方が簡単です。
>kjmtshさん
回答ありがとうございます。
まず、わたしの説明が下手なため、誤解を生んでしまいましたが、一つ前の書き込みに書いたソースは、page-works.phpという固定ページに書いたソースです。
>固定ページ自体のコンテンツがあって、それに加えて投稿リストを表示したいとかいうのでなければ、
固定ページ自体のコンテンツがあって、それに加えて投稿リストを表示したいと思っています。もちろんPagenaviも。
上記のソースを使わせて頂きましたが、やはり同じように固定ページのトップには投稿記事とページナビが表示されるのですが、2ページ目以降のリンクに飛ぶと、トップページの表示になってしまいます。(URLはpage/2/のようになっています)
page-works.phpではなく、他のphpのページの問題も考えられるのでしょうか…?
実は、h-pine-h さんの一つ前の投稿でお示しになったコードでも動作するはずなのですが、2つ別の方法で、同じ結果ということは、どこか別に原因があるかもしれません。
念のため、
echo $the_query->found_posts . '<br />';
echo $the_query->query_vars['posts_per_page'] . '<br />';
echo $the_query->max_num_pages . '<br />';
を追加して、出力を教えていただけますか? あと、パーマリンクの設定も知りたいです。
>kjmsthさん
ご親切にありがとうございます。
出力は、上から11、5、3となります。
パーマリンクの設定は投稿名となっていて、この固定ページは●●/worksとなっています。
パーマリンクの設定、今まで意識していなかったのですが、変えた方が宜しいでしょうか?
数値は、こんな意味です。検索でヒットした投稿数が 11 個、1 ページに表示する投稿数は 5 個、だから、11 割る 5 は、2あまり1、切り上げて 3 ページ分、という意味です。これ合ってますよね?
WordPress はちゃんと正しい計算をして、このクエリは 3 ページ目までありますよ、という情報を持っています。たぶん、h-pine-h さんのコードでも同じ値になるはずです。
パーマリンクはそれでも、私のところでちゃんと動いていますので、大丈夫のようです。でも、原因がぜんぜんわかりませんねぇ。思いつきですが、「超簡単テンプレート」にして試してみましょうか?
<?php
/**
* Template Name: Very Simple Page
*
*/
?>
<html lang="ja">
<head>
<?php wp_head();?>
</head>
<body>
<?php if (have_posts()) :?>
<?php while (have_posts()) : the_post(); ?>
<?php the_title(); ?>
<?php endwhile; endif; ?>
<?php
$args = array(
'posts_per_page' => 5,
'paged' => get_query_var('paged');
);
$the_query = new WP_Query($args);
if ($the_query->have_posts()) {
while ($the_query->have_posts()) {
$the_query->the_post();
the_title();
}
}
wp_pagenvi(array('query' => $the_query));
wp_reset_postdata();
?>
<?php wp_footer();?>
</body>
</html>
これを固定ページのテンプレートとしてみると、どうでしょう? もうあてずっぽうですが…
>kjmsthさん
テストとして、ご用意して頂いたテンプレートを(titleをcontentに変更しただけのものを)一度使用すると、ページング機能が使えましたので、page-works.phpに流用しました。
結果、こちらでも2ページ目以降もページ内容が表示されました!
今までも「エラー」は出ていなかったので、ご用意して頂いたソースは適用できていたと思うのですが、不思議ですね…とにかくありがとうございました!
page-works.phpの最終的ソースは次のとおりです。
<?php
/*
Template Name: works
*/
?>
<?php get_header(); ?>
<img id="sub_title" src="<?php echo get_template_directory_uri(); ?>/images/works_title.jpg" alt="works 制作実績">
<!-- Contents -->
<div id="contents_w">
<?php if (have_posts()) :?>
<?php while (have_posts()) : the_post(); ?>
<?php the_content(); ?>
<?php endwhile; endif; ?>
<?php
$args = array(
'posts_per_page' => 5,
'paged' => get_query_var('paged'),
);
$the_query = new WP_Query($args);
if ($the_query->have_posts()) {
while ($the_query->have_posts()) {
$the_query->the_post();
the_content();
}
}
wp_pagenavi(array('query' => $the_query));
wp_reset_postdata();
?>
</div>
<?php get_footer(); ?>
解決済みになっちゃったので、つなげるのは申し訳ないですが…
原因はたぶん、メインループが介入していると思うんですよね。wp_pagenavi() 関数がメインループのオブジェクトを参照していると、固定ページは2ページ目がありませんから、index.php に飛ばされるということだと思うんです。「超簡単テンプレート」はそれをきっちり分けるようにしたものです。
ウェブを検索すると、WP-PageNavi の「バグ」という報告も目にするのですが、使い方が間違えていることもあるし、古いバージョンのこともあります。新しいバージョンは、ちゃんと使えば正しく動作するようになっていると思いますよ。
実は、作者に、「翻訳するから GlotPress のアカウントくれないか」といって、わざわざアカウントを作ってもらったのですが、最近ちょっと手抜きで、最新バージョンの翻訳が追いついていません。だから、ささやかな罪滅ぼしということで、ご勘弁を。
>kjmtshさん
最後まで本当にありがとうございました!
今基礎からphpはじめたところなので、今後スクリプトの中身を理解できるようになれればと思います。