サポート » テーマ » アーカイブページで標準の投稿とカスタム投稿を表示させる方法

  • 解決済 senkegs

    (@senkegs)


    twenty fifteenから子テーマを作り、プラグインのCustom Post Type UIを使用しています。

    Custom Post Type UIで作ったカスタム投稿のビルトイン分類で、カテゴリーとタグにチェックを入れましたが、カテゴリー名、その他作者名など、投稿で表示されている情報が表示することができません。

    通常であればtwentyfifteen_entry_meta()という関数で表示されるように設定されているのですが、カスタム投稿の個別ページでは適応されなかったため、
    twentyfifteen_entry_meta()関数が設定されている、twentyfifteen/inc/template-tags.phpからカテゴリーなどを表示させるコードを一式コピーしてcontent.phpに貼り付けました。

    記述自体はされたのですが、例えばカテゴリーをクリックしてアーカイブページにいくと、カスタム投稿の記事はなく標準の投稿記事しかありません。

    標準の投稿とカスタムフィールドでのアーカイブはどのようにすれば共有できるのでしょうか。
    すみませんがご教授頂ければ幸いです。

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

    (@jim912)

    確認してみたところ、デフォルトではカスタム投稿タイプでカテゴリーを使えるようにしても、カテゴリーアーカイブでは、投稿のみしか表示されないようです。どうにもバグっぽいのですが、とりあえず pre_get_posts でカテゴリーとタグが使える投稿タイプを洗い出し、post_type で指定されるコードを書いてみました。

    function custom_pre_get_posts( $wp_query ) {
    	if ( ! is_admin() && $wp_query->is_main_query() ) {
    		if ( $wp_query->is_category() || $wp_query->is_tag() ) {
    			$post_types = array();
    			$all_post_types = get_post_types( array( 'exclude_from_search' => false ) );
    			if ( $wp_query->is_category() ) {
    				foreach ( $all_post_types as $pt ) {
    					$object_taxonomies = $pt === 'attachment' ? get_taxonomies_for_attachments() : get_object_taxonomies( $pt );
    					if ( in_array( 'category', $object_taxonomies ) && ! in_array( $pt, $post_types ) ) {
    						$post_types[] = $pt;
    					}
    				}
    			}
    			if ( $wp_query->is_tag() ) {
    				foreach ( $all_post_types as $pt ) {
    					$object_taxonomies = $pt === 'attachment' ? get_taxonomies_for_attachments() : get_object_taxonomies( $pt );
    					if ( in_array( 'category', $object_taxonomies ) && ! in_array( $pt, $post_types ) ) {
    						$post_types[] = $pt;
    					}
    				}
    			}
    			if ( $post_types ) {
    				$wp_query->set( 'post_type', $post_types );
    			}
    		}
    	}
    }
    add_action( 'pre_get_posts', 'custom_pre_get_posts' );

    お答えありがとうございます。
    バグなのですか…どうりで出来なかったわけですね。。
    原因が判明して良かったです。

    教えて頂いたコードをfunctions.phpに記載しましたところ、無事実装できました!
    ありがとうございます。

    ただ、phpもといwordpressに詳しくないので、内容がよくわからず..
    不明点もありつつ自分なりに以下のように解釈しましたが、こんな感じでしょうか?

    function custom_pre_get_posts( $wp_query ) {
      //管理画面ではなく、メインクエリーの場合
    	if ( ! is_admin() && $wp_query->is_main_query() ) {
    		if ( $wp_query->is_category() || $wp_query->is_tag() ) {
    
    			$post_types = array();//空の配列
    			$all_post_types = get_post_types( array( 'exclude_from_search' => false ) );//検索対象に含まれる全ての投稿(メディア含む)を取得
    
    			//カテゴリーページの場合
    			if ( $wp_query->is_category() ) {
    
    			  //投稿があるだけ繰り返し
    				foreach ( $all_post_types as $pt ) {
    					$object_taxonomies = $pt === 'attachment' ? get_taxonomies_for_attachments() : get_object_taxonomies( $pt );//attachment(メディアが)が添付されていれば、タクソノミーのメディアを取得、無ければ全てのタクソノミーの値(メディアも?)を取得
    					if ( in_array( 'category', $object_taxonomies ) && ! in_array( $pt, $post_types ) ) {//$object_taxonomiesの中にcategoryがあり、$post_typesに$ptが含まれていれば...(?)
    						$post_types[] = $pt;//空の配列に代入していく
    					}
    				}
    			}
    
    			//タグページの場合
    			if ( $wp_query->is_tag() ) {
    				foreach ( $all_post_types as $pt ) {
    					$object_taxonomies = $pt === 'attachment' ? get_taxonomies_for_attachments() : get_object_taxonomies( $pt );
    					if ( in_array( 'category', $object_taxonomies ) && ! in_array( $pt, $post_types ) ) {//タグページなのにcategoryとは何故でしょうか..?
    						$post_types[] = $pt;
    					}
    				}
    			}
    			if ( $post_types ) {
    				$wp_query->set( 'post_type', $post_types );//$post_typesを投稿順に
    			}
    		}
    	}
    }
    add_action( 'pre_get_posts', 'custom_pre_get_posts' );

    また、別トピを立てた方が良いかもしれませんが、投稿の順番を変えるプラグインもきかず、バグかもということで、同じようにfunctions.phpで設定しようと思いました。
    (一覧ページだけなら実装できたのですが、個別ページが投稿順でページ送りになってしまったので、pre_get_postsを使えばよいのかなと..後出しですみません)

    if ( $post_types ) {
    $wp_query->set( ‘post_type’, $post_types );
    }

    の後に以下のコードを挿入しましたが、上手くいきませんでした。。

    if ( $wp_query->is_post_type_archive('カスタムフィールド名')){
    				$wp_query->set( 'post_type', 'カスタムフィールド名' );
    				$wp_query->set( 'order', 'DESC' );//タクソノミーの値でソート
    				$tax_query[] = array(
    						'taxonomy'=>'タクソノミー名',
    						'field'=>'slug'
    						);
    
    				 $wp_query->set('tax_query', $tax_query);
    			}

    よろしければ、こちらも教えて頂ければ幸いです。
    すみませんがよろしくお願い致します。

    モデレーター jim912

    (@jim912)

    個別ページの前後リンクの事であれば、pre_get_posts での調整はできません。

    そうなんですね、ありがとうございます。
    pre_get_postsはメインクエリーを書き換え、個別ページも順応すると思っているのですが、そういうものではないのでしょうか?

    ということを踏まえて色々考えみましたが、
    今回のカスタム投稿タイプにカテゴリーなどが表示されなかったのは、投稿とカテゴリーの記事でページ送りが複雑になるを避けるため、という気がしてきました。

    モデレーター jim912

    (@jim912)

    pre_get_postsはメインクエリーを書き換え、個別ページも順応すると思っているのですが、そういうものではないのでしょうか?

    メインクエリーは、そのページのメインループで表示されるものを取得するもので、個別ページの前後リンクは、また別の取得方法で行われています。
    個別ページの前後リンクの順序を変更するのであれば、get_next_post_sort、get_previous_post_sort の2つのフィルターにフックして、SQLの書き換えを行う必要があります。

    それぞれのページでの設定になるのですね、勉強になります。

    タイトルと内容が外れてきましたので、get_next_post_sort、get_previous_post_sortを試してみて、また分からなければ改めて質問させて頂きます。

    有難う御座いました!

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • トピック「アーカイブページで標準の投稿とカスタム投稿を表示させる方法」には新たに返信することはできません。