質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

Q&A

解決済

3回答

2951閲覧

特定のカテゴリーにカスタム投稿タイプを混ぜて表示したい

at0059

総合スコア12

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

0グッド

0クリップ

投稿2018/06/13 06:01

編集2018/06/13 09:40

前提・実現したいこと

WordPressにて、特定のカテゴリーにカスタム投稿タイプを混ぜて表示したいです。

特定のカテゴリーID:735
カスタム投稿タイプのスラッグ:program

== 追記 ==

以下のような感じで、カテゴリーやカスタム投稿を作っています。

投稿  └カテゴリーA (ID:735)    └各記事  └カテゴリーB(ID:×××)    └各記事  └カテゴリーC(ID:×××)    └各記事 カスタム投稿「program」  └各記事 (タクソノミーは特に作っておりません)

上記のカテゴリーA(ID:735)の記事一覧をcatetory.phpで出力することはできますが、
その中に、カスタム投稿タイプ「program」を混ぜたいと思っています。

== /追記 ==

pre_get_postsを使用して対応しようとしていますがうまくできず、
ご教示いただけないでしょうか。

発生している問題・エラーメッセージ

カスタム投稿タイプが表示されず、特定のカテゴリーのみ出力されてしまいます。

該当のソースコード

以下コードをfunctions.phpに記載しています。

function cat_post($query) { if ( is_admin() || ! $query->is_main_query() ){ return; } if ( $query->is_category(735) ) { $query->set( 'post_type', array('post','program') ); return; } } add_action( 'pre_get_posts', 'cat_post' );

以下コードをcategory.phpに記載しています。

<?php if(have_posts()) : while(have_posts()) : the_post(); ?> <a href="<?php the_permalink() ;?>"> <div class="title"><?php the_title(); ?></div> </a> <?php endwhile; ?> <div class="navigation"> <?php if(function_exists('wp_pagenavi')): ?> <?php wp_pagenavi(); ?> <?php else : ?> <?php endif; ?> </div> <?php endif; ?>

何か根本的なことが間違っているのでしょうか。
恐れ入りますが、ご教示いただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/06/13 08:31

投稿タイプ「post」と「program」でタクソノミー「category」を共通で使用できるようになっているのでしょうか?
at0059

2018/06/13 09:42

kuck1u様  ご指摘をいただきありがとうございます。 「タクソノミー「category」を共通で使用できるように」 ですが、申し訳ありません、私の理解不足でご指摘の意味を把握できておりません。 回答になっていないかもしれませんが、現状についてもう少し具体的な補足を入れましたので、ご確認いただけますと幸いです。よろしくお願い致します。
guest

回答3

0

対象となる投稿タイプを増やしても、program 投稿タイプに735カテゴリーが割り当てられていないので、カテゴリーの判定で間引かれてしまっているのだと思います。

program 投稿タイプの投稿すべてに735カテゴリーを割り当てるか、program 投稿タイプに固有の taxonomy があれば category クエリを消した上でtax_queryでカテゴリー一致と固有の taxonomy の有無でORを取れば良さそうですね。

投稿2018/06/13 09:15

yhg

総合スコア2161

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

at0059

2018/06/13 11:52

yhg様 ありがとうございます。 表示自体は無事にできるようになりました。 ただページャーが2ページ目以降404表示になってしまいますが 何かご教示いただけそうなことはございますでしょうか。 一応これまでの経緯含め、以下に記載させていただきます。 特定のカテゴリーにカスタム投稿タイプを混ぜて表示したかった。 (category.phpで出力する一覧にカスタム投稿タイプ「program」を混ぜたかった) ↓ サブクエリーではなく、メインクエリーで処理しようとし、 functions.phpに以下を記載。 function cat_post($query) { if ( is_admin() || ! $query->is_main_query() ){ return; } if ( $query->is_category(735) ) { $query->set( 'post_type', array('post','program') ); return; } } add_action( 'pre_get_posts', 'cat_post' ); ↓ 「 if ( $query->is_category(735) )」でカスタム投稿タイプが間引きされてしまっている。 そもそも、pre_get_postsを使ってメインクエリーの改変でカテゴリーとカスタム投稿タイプを混ぜて表示すること自体ができない(?) ↓ category-××.phpに サブクエリーを作成することで表示は無事にできた。 <?php $paged = get_query_var('paged'); $args = array( 'tax_query' => array( 'relation' => 'OR', array( 'taxonomy' => 'タクソノミーの名前', 'field' => 'slug', 'terms' => array('タームの名前'), ), array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => '特定のカテゴリーのカテゴリー名', ) ), 'paged' => $paged ); $the_query = new WP_Query( $args ); ?> <?php if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?> <a href="<?php the_permalink() ;?>"> <div class="outline"> <div class="title"><?php the_title(); ?></div> </div> </a> <?php endwhile; ?> <div class="navigation"> <?php if(function_exists('wp_pagenavi')): ?> <?php wp_pagenavi(); ?> <?php endif; ?> </div> <?php endif; ?> <?php wp_reset_query(); ?> ただ、2ページ目以降が404になってしまいます。 *WPの表示設定は10件 *特定のカテゴリーへの投稿数は現在2件だけ投稿済 === 以下、考察 呼び出し、実行される順番は メインクエリー → テンプレート → サブクエリー つまりメインクエリー実行時点で投稿数が2件であるため、 ×××××××.com/category/カテゴリー名/page/2 はそもそも404表示になる? ↑ この考察はあっていますでしょうか。 とすると、そもそもサブクエリーで今回の対応をしたこと自体が間違いなのでしょうか。 本当に申し訳ありませんが、 ご教示いただけますと幸いです。 *WPのアーキテクチャに関しては詳しくはなく、色々調べながら、というレベルでございます。 よろしくお願い致します。
yhg

2018/06/13 12:13

その考察で合ってそうですね。 $query->set('cat', ''); $query->set('tax_query', array( 'relation' => 'OR', array( 'taxonomy' => 'タクソノミーの名前', 'field' => 'slug', 'terms' => array('タームの名前'), ), array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => '特定のカテゴリーのカテゴリー名', ), )); のようにメインクエリーでtax_queryをセットしてみるとどうなるでしょうか?
at0059

2018/06/13 13:18

yhg 様 考察のご確認とご提案をいただき、 本当にありがとうございます。 いただいたコードですが、大変お恥ずかしいのですが、 functions.phpでどのように記載したら良いかわかっておらず、 もう少しご教示いただくことは可能でしょうか。 当初私がfunctions.php書いてあった if ( $query->is_category(735) ) { $query->set( 'post_type', array('post','program') ); return; } の「if ( $query->is_category(735) ) 」 のカテゴリーの判定で カスタム投稿タイプが間引かれているので、ここを書き換えた上で、 ご提示いただいたコードを活用するのかと思っているのですが、 どのように記述が必要でしょうか。 何度も大変申し訳ありません。 ちなみに、一番最初にご提案いただいた 「program 投稿タイプの投稿すべてに735カテゴリーを割り当てる」 方法においては、kuck1u様のご指導と合わせてトライした結果、 やりたいことを実現することができました! 本当にありがとうございます! おかげさまで希望の動作を実現できましたが、 もしよろしければ上記の方法についても勉強させていただきたく、 ご教示いただけますと幸甚です。 どうぞよろしくお願い致します。
yhg

2018/06/13 14:05

if ( $query->is_category(735) ) { $query->set( 'post_type', array('post','program') ); // ここに記載。条件の内側で cat, tax_query を書き換え。 return; }
at0059

2018/06/14 04:36

yhg 様 早速のご回答ありがとうございます。 先程やってみたところ、無事に表示できました。 お陰様で2種類の方法どちらでも実現することができ、幅が広がりとても嬉しいです。 ここまで大変丁寧にご教示いただき、感謝申し上げます。 また何かの際にはご指導の程、よろしくお願い致します。 本当にありがとうございました!
guest

0

ベストアンサー

何もカスタマイズしていない場合、デフォルトのタクソノミー「カテゴリー(category)」と「タグ(post_tag)」は、デフォルトの投稿タイプ「投稿(post)」でしか使用できません。
デフォルトの投稿タイプ「投稿(post)」とカスタム投稿タイプで共通で『カテゴリー(category)』や『タグ(post_tag)」を使用したい場合は、少々カスタマイズする必要があります。

以下のコードを使用中のテーマの functions.php に追加してみてください。

php

1<?php 2/** 3 * デフォルトの投稿タイプ「post」に設定されているタクソノミー「カテゴリー」を 4 * カスタム投稿タイプ「program」でも使用できるようにする 5 */ 6add_action( 'init', function () { 7 register_taxonomy_for_object_type( 'category', 'program' ); 8} );

そうすると、管理画面左側のメニューにあるカスタム投稿タイプ「program」の新規追加の下に「カテゴリー」という表示がでてくるかと思います。これで、カスタム投稿タイプ「program」でも「カテゴリー(category)」を使用できるようになりました。

あとは、program の記事を新規作成 or 編集して category id = 735 を選択し、pre_get_posts でカスタム投稿タイプ「program」をセットしてあげればよいです。

※ 見当違いな解答だった場合申し訳ございません。

投稿2018/06/13 11:50

編集2018/06/13 12:20
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/06/13 12:01 編集

あ、ごめんなさい。↑の要望のものとはちょっと違いますね(汗)
at0059

2018/06/13 13:14

kuck1u 様 ご丁寧にご指導いただき、ありがとうございます。 よく理解できました。 またいただいたコードを使い、 本件でやりたかったことを実現することができました。 とても勉強になりました! ご教示いただきまして、本当にありがとうございました! コメント欄で恐縮ですが、 最終的にやったことを念の為、 ここに残させていただきます。 === ①「カスタム投稿タイプのスラッグ:program」において、 特定のカテゴリー(ID:735)を選択できるように kuck1u様よりいただいたコードをfunctions.phpに記載。 その上で、programの投稿画面で特定のカテゴリーにチェック。 ↓ ②さらに以下のコードをfunctions.phpに記載することで、 特定のカテゴリー(ID:735)のメインクエリーを改変した。 function cat_post($query) { if ( is_admin() || ! $query->is_main_query() ){ return; } if ( $query->is_category(735) ) { $query->set( 'post_type', array('post','program') ); return; } } add_action( 'pre_get_posts', 'cat_post' ); ③category.phpには以下を記載 <?php if(have_posts()) : while(have_posts()) : the_post(); ?> <a href="<?php the_permalink() ;?>"> <div class="title"><?php the_title(); ?></div> </a> <?php endwhile; ?> <div class="navigation"> <?php if(function_exists('wp_pagenavi')): ?> <?php wp_pagenavi(); ?> <?php endif; ?> </div> <?php endif; ?> ===
guest

0

確証なくてすみませんが、
下記の箇所あやしいです。

php

1if ( $query->is_category(735) ) { 2 $query->set( 'post_type', array('post','program') ); 3 return; 4 }

クエリーが、ID735のカテゴリの場合、クエリーにセットして、
それで関数の処理を終了させる、というコードになっているようなので、
ここを中心に見直されてはいかがでしょうか?

投稿2018/06/13 06:09

miyabi_takatsuk

総合スコア9528

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyabi_takatsuk

2018/06/13 06:15

大変申し訳ございません、回答として不適切だと思うので、回答の削除依頼をしております。
at0059

2018/06/13 09:44

miyabi_takatsuk様 ご回答いただきありがとうございます。削除依頼の旨承知いたしました。ご丁寧にありがとうございます。何か他にもご指摘の点がございましたらどうぞよろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問