サポート » 使い方全般 » カスタム投稿 archive-○○.php について

  • 解決済 aquas

    (@aquas)


    カスタム投稿にて、記事一覧アーカイブを作ろうとしております。

    query_posts ではなく、
    functions.php の中に、コードを書き込む、という方法を取っております。

    コードは、以下のような感じです。

    function my_pre_get_posts( $query ) {
    	if ( is_admin() || ! $query -> is_main_query() ) return;
    
        if ( $query->is_post_type_archive('aaa') ) {
    		$query -> set( 'posts_per_page', '3' );
    		$query -> set( 'post_type' , 'aaa');
    	}
    }
    add_action( 'pre_get_posts', 'my_pre_get_posts' );

    こうすると、『archive-aaa.php』で、表示がされます。
    しかし、このページの中でカスタム投稿『bbb』を表示させようと思い、

    function my_pre_get_posts( $query ) {
    	if ( is_admin() || ! $query -> is_main_query() ) return;
    
        if ( $query->is_post_type_archive('aaa') ) {
    		$query -> set( 'posts_per_page', '3' );
    		$query -> set( 'post_type' , 'bbb');
    	}
    }
    add_action( 'pre_get_posts', 'my_pre_get_posts' );

    とすると、「ページがありません」になってしまいます。
    別途「archive-bbb.php」をつくると、表示されるようです。

    『archive-aaa.php』にて、カスタム投稿「bbb」を表示させることは、
    不可能なのでしょうか?

    どうぞよろしくお願い致します。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • モデレーター Takuro Hishikawa

    (@hissy)

    こちらからの続きですね。
    http://ja.forums.wordpress.org/topic/24888

    改めて考えてみて、ようやく、仰っている意味が理解できました。aaa投稿タイプアーカイブのURL( http://example.com/?post_type=aaa )にアクセスして、bbb投稿タイプのデータが表示されているので、ちゃんと動いているじゃないか。と思っていましたが、表示されるデータは正しいが、その場合はbbb投稿タイプアーカイブのテンプレート( archive-bbb.php )が使われてしまう、ということなんですね。前半の話かとずっと思っていました。

    このコードでは、投稿タイプをbbbに変更しているので、ある意味 archive-bbb.php が使われるのは当然というか、正しい挙動なんですよね。なので、それを防止するには、aaa投稿タイプアーカイブにアクセスした際に使われるテンプレートを強制するしか無いです。

    <?php
    /*
    Plugin Name: topic 25137
    Version: 0.1
    */
    
    function my_pre_get_posts( $query ) {
    	if ( is_admin() || ! $query -> is_main_query() ) return;
    
        if ( $query->is_post_type_archive('aaa') ) {
    		$query->set( 'posts_per_page', '3' );
    		$query->set( 'post_type', 'bbb');
    	}
    }
    add_action( 'pre_get_posts', 'my_pre_get_posts' );
    
    function my_archive_template($template){
    	if ( is_post_type_archive('aaa') ) {
    		$templates = array( "archive-aaa.php", "archive.php" );
    		$template = get_query_template( 'archive', $templates );
    	}
    	return $template;
    }
    add_filter('template_include','my_archive_template');

    しかし、ここまでやるなら、もはやテンプレート名は何でもアリです。

    トピック投稿者 aquas

    (@aquas)

    hissy様

    ご丁寧にご返答くださいまして、ありがとうございます!
    私の言葉足らずの説明のせいで、
    いろいろと、振り回してしまったのに…ここまで、お考えくださいまして、ありがとうございます!

    archive-bbb が、正しい挙動だと、知ることができて、
    胸のつかえがとれた思いです!

    テンプレートの強制、なんて、できたんですね!
    大変勉強になりました。

    今後とも、また、どうぞよろしくお願い致します!

    モデレーター Takuro Hishikawa

    (@hissy)

    テンプレートの強制、なんて、できたんですね!

    そうですね。特に、pre_get_postsフィルターで投稿タイプを複数指定する場合、どの投稿タイプ名がテンプレートのファイル名として使われるかは予測できないので、archive.phpを使うか、あるいはこの例のように自動で選ばれるのをキャンセルして使われるテンプレートを強制するか、ですね…。

    解決したのであれば、前の投稿の方も解決済みにしておいてくださいね。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「カスタム投稿 archive-○○.php について」には新たに返信することはできません。