サポート » 使い方全般 » タクソノミーアーカイブでページングすると違うテンプレートが適用され

  • 解決済 sygnas

    (@sygnas)


    カスタムタクソノミーのアーカイブページを作成しています。
    1ページ目は目的のテンプレートが読み込まれるのですが、
    2ページ目以降は index.php が表示されてしまい難儀しております。

    解決方をご存じの方がいましたらご教授くださいませ。

    ■状況
    WordPress 3.3.1
    タクソノミー名:genre
    分類名:rock
    テンプレート:taxonomy-genre.php
    正常なURL:http://~/genre/rock/
    2ページ目のURL:http://~/genre/rock/page/2/

    ■カスタムタクソノミー設定
    プラグイン「Custom Post Type UI」を使用しています。

    分類名:genre
    ラベル:ジャンル
    単数形:<空白>
    階層:false
    UI表示:true
    クエリーバージョン:true
    リライト:true
    カスタムリライトスラッグ:<空白>

    ■スクリプト
    表示件数と並び順を制御したいので query_posts() を使用しています。

    // ページ数
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    
    // 新着5件取得
    query_posts( array(
      'post_type' => 'sounds',
      'taxonomy' => 'genre',
      'term' => single_term_title('', false),
      'posts_per_page' => 5,
      'paged' => $paged,
      'order' => 'DESC'
    ));
    
    if (have_posts()) :while (have_posts()) :
      the_post();
      ~表示~
     endwhile;
     endif;
    
    wp_pagenavi();
    wp_reset_query();

10件の返信を表示中 - 1 - 10件目 (全10件中)
  • まだWordpressを使い始めたばかりの超初心者なので、投稿するのをためらっていたのですが、誰も返信がないようなので…初投稿です。

    私も、昨日丸一日、全く同じ現象で悩んでいたのですが、「Custom Post Type Category Pagination Fix」というプラグインをインスト-ルすることによってあっさりと解決しました。

    的外れな回答でなければいいのですが。。。

    トピック投稿者 sygnas

    (@sygnas)

    >mzplace様

    有益な情報ありがとうございます!
    しかしながらインストールしても状況は変わりませんでした。^^;
    とはいえ、いただいた情報をヒントにひとつわかったのは

    index.php を表示していたのではなく、404.phpが表示されている

    ということです(404.phpを用意してみたら表示されました)。
    調査の範囲はぐっと狭まりました。
    逆にカスタムポストタイプのページネーションは上手くいっているのも謎です……。
    http://~/ポストタイプ/page/2/ は問題ないのです。

    ‘term’ => single_term_title(”, false), ここが怪しいです。

    taxonomy-genre.php を用意されているので、見たところ、オリジナルのクエリを変更してる箇所は、post_typeposts_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() はいらないはずです。

    トピック投稿者 sygnas

    (@sygnas)

    >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'
        )
    );

    検索するとかなりポピュラーな詰まりどころなのに、コレという解決法はなかなかないですね……。

    トピック投稿者 sygnas

    (@sygnas)

    解決しました!
    結論から言うと、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さんの環境では動作しているのですか?

    すみません。上記は私の間違いです。
    配列を渡しても動作しました。

    トピック投稿者 sygnas

    (@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' );
    トピック投稿者 sygnas

    (@sygnas)

    ありがとうございます。
    pre_get_postsで数を変更、さらに is_main_query()でメインかどうかの判別ですか。
    なるほどーー。奥が深いです。

10件の返信を表示中 - 1 - 10件目 (全10件中)
  • トピック「タクソノミーアーカイブでページングすると違うテンプレートが適用され」には新たに返信することはできません。