まだWordpressを使い始めたばかりの超初心者なので、投稿するのをためらっていたのですが、誰も返信がないようなので…初投稿です。
私も、昨日丸一日、全く同じ現象で悩んでいたのですが、「Custom Post Type Category Pagination Fix」というプラグインをインスト-ルすることによってあっさりと解決しました。
的外れな回答でなければいいのですが。。。
>mzplace様
有益な情報ありがとうございます!
しかしながらインストールしても状況は変わりませんでした。^^;
とはいえ、いただいた情報をヒントにひとつわかったのは
index.php を表示していたのではなく、404.phpが表示されている
ということです(404.phpを用意してみたら表示されました)。
調査の範囲はぐっと狭まりました。
逆にカスタムポストタイプのページネーションは上手くいっているのも謎です……。
http://~/ポストタイプ/page/2/ は問題ないのです。
‘term’ => single_term_title(”, false), ここが怪しいです。
taxonomy-genre.php を用意されているので、見たところ、オリジナルのクエリを変更してる箇所は、post_type と posts_per_page だけだと思います。なので、変更部分だけを $wp_query->query に追加(上書き)する、という感じで書けばいいのでは?(*試してません)
query_posts( array_merge(
array( 'post_type' => 'sounds', 'posts_per_page' => 5 ),
$wp_query->query
));
if (have_posts()) :while (have_posts()) :
the_post();
~表示~
endwhile; endif;
wp_pagenavi();
sygnasさんが設定した引数 array() と、当該タームのオリジナルクエリ統合するという形です。ページ数の取得と wp_reset_query() はいらないはずです。
>LVP8様
ありがとうございます。なるほど、$wp_query->query はそのように使うのですね。
query_posts( array(
'post_type' => 'sounds',
'posts_per_page' => 5,
'order' => 'DESC'
),
$wp_query->query
);
と記述してみましたが、やはり404.phpが表示されました。
wp_reset_query() はコメントアウトしてあります。
プラグインを使わず function.php に記述して rewriteを変更→パーマリンク設定更新
をやってみたのですが、with_front、hierarchical、どちらを使う設定もダメでした。
register_taxonomy(
'genre',
array (
0 => 'sounds',
),
array(
'hierarchical' => true,
'label' => 'ジャンル',
'show_ui' => true,
'query_var' => true,
// 'rewrite' => array( true, 'with_front' => false ),
'rewrite' => array( 'with_front' => true, 'hierarchical' => true ),
'singular_label' => 'genre'
)
);
検索するとかなりポピュラーな詰まりどころなのに、コレという解決法はなかなかないですね……。
解決しました!
結論から言うと、WordPressの表示設定「1ページに表示する最大投稿数」が関係していました。
http://d.hatena.ne.jp/nakagaw/20100710/1278803760
そこの設定が「10」件、今回の検索部分は「5」件、登録数「8」件という状態で、
2ページ目(11件目から表示)は Not Foundになるというわけです。
ということは、ページ毎の表示件数は統一せざる得ないということですか……?
また上記を解消しても、query_posts() で $wp_query->query を使うと、ページが変わっても、タクソノミー分類が変わっても反映されなかったため、当初の書き方に戻しました。さらに言うとURIを「分類(ターム)名」ではなくスラッグにしたかったので、最終的には下記のようになりました。
// ページ数
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
// ターム情報
$term = get_term_by( 'name', single_term_title('', false), 'genre' );
query_posts( array(
'post_type' => 'sounds',
'taxonomy' => 'genre',
'term' => $term->slug,
'posts_per_page' => 5,
'paged' => $paged,
'order' => 'DESC'
));
タクソノミー登録 register_taxonomy() の rewriteオプションは下記のどれでも問題なく動作しました。
'rewrite' => array( true, 'with_front' => false ),
'rewrite' => array( 'with_front' => true, 'hierarchical' => true ),
'rewrite' => array( 'slug'=>'genre' ),
ひとまず解決しましたが今度は「表示設定の影響を受けてしまう」という難問が生まれてしまいましたが、それについてはまた調べてみたいと思います。
相談にのってくださったmzplace様、LVP8様ありがとうございました。
解決した後ですが、記述間違いがあるのではないかと思います。
LVP8さんが紹介した方法の場合、array_merge()が必要です。
コードもそのようになっています。
query_post()に配列をそのまま渡しても動作しないはずですが、sygnasさんの環境では動作しているのですか?
正しい使い方は、次のいづれかになります。
global $query_string;
query_posts( $query_string . "&order=ASC" );
この形式で query_posts() を使う場合は、二重引用符で囲んだ引数をアンド記号(&)で始めてください。または複数の値の引数を追加する場合、配列にする必要があります。
global $query_string;
parse_str( $query_string, $args );
$args[post_type] = array( 'post', 'video' );
query_posts( $args );
さらに、元のクエリ配列を引数配列に統合することもできます。
global $wp_query;
$args = array_merge( $wp_query->query, array( 'post_type' => 'product' ) );
query_posts( $args );
http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/query_posts
URIに関してですが、管理画面でスラッグを設定してあれば、自然に「http://~/タクソノミー/スラッグ」というアドレスになります。
LVP8さんのコードをもう一度試してはいかがでしょうか?
post_typeの指定もなくても大丈夫かもしれません。
$args = array_merge( $wp_query->query, array( 'posts_per_page' => 5 ) );
query_posts($args);
query_post()に配列をそのまま渡しても動作しないはずですが、sygnasさんの環境では動作しているのですか?
すみません。上記は私の間違いです。
配列を渡しても動作しました。
>popup様
ありがとうございます。
おかげでだいぶスッキリいたしました。スラッグについても仰る通りでした。
global $wp_query;
$args = array_merge(
$wp_query->query,
array(
'posts_per_page' => 5
)
);
query_posts( $args );
ページによって表示件数を変更するということについては表示設定のほうを「1件」にすることで対応できました。
解決した後ではありますが、表示件数変更の問題に関しては、次の方法で解決出来ることがわかりましたのでお知らせします。
メールで通知を受け取る設定にしていないと届かないと思いますが一応。
http://ja.forums.wordpress.org/topic/10121?replies=3
上記トピックにあるように、is_main_query()を使用して標準のクエリの表示件数を変更します。
標準のクエリでなおかつタクソノミーがgenreの表示件数を変更する場合は、次のようにすると大丈夫かと思います。
function genre_display_five_articles( $wp_query ) {
if ( $wp_query->is_main_query() && $wp_query->query['genre'] ) {
$wp_query->set( 'posts_per_page', 5 );
}
}
add_action( 'pre_get_posts', 'genre_display_five_articles' );
ありがとうございます。
pre_get_postsで数を変更、さらに is_main_query()でメインかどうかの判別ですか。
なるほどーー。奥が深いです。