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

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

ただいまの
回答率

90.51%

  • WordPress

    7396questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 226

at0059

score 4

 前提・実現したいこと

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; ?>

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kuck1u

    2018/06/13 17:31

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

    キャンセル

  • at0059

    2018/06/13 18:42

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

    キャンセル

回答 3

+3

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/13 20: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のアーキテクチャに関しては詳しくはなく、色々調べながら、というレベルでございます。

    よろしくお願い致します。

    キャンセル

  • 2018/06/13 21: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をセットしてみるとどうなるでしょうか?

    キャンセル

  • 2018/06/13 22: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様のご指導と合わせてトライした結果、
    やりたいことを実現することができました!
    本当にありがとうございます!

    おかげさまで希望の動作を実現できましたが、
    もしよろしければ上記の方法についても勉強させていただきたく、
    ご教示いただけますと幸甚です。

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

    キャンセル

  • 2018/06/13 23:05

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

    キャンセル

  • 2018/06/14 13:36

    yhg 様
    早速のご回答ありがとうございます。
    先程やってみたところ、無事に表示できました。

    お陰様で2種類の方法どちらでも実現することができ、幅が広がりとても嬉しいです。
    ここまで大変丁寧にご教示いただき、感謝申し上げます。

    また何かの際にはご指導の程、よろしくお願い致します。
    本当にありがとうございました!

    キャンセル

checkベストアンサー

+1

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

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/13 20:54 編集

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

    キャンセル

  • 2018/06/13 22: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; ?>

    ===

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/13 15:15

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

    キャンセル

  • 2018/06/13 18:44

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

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • WordPress

    7396questions

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