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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

2952閲覧

複数投稿タイプで共通のタクソノミーを使用する際に、投稿タイプごとで異なるレイアウトを指定したい

ztj

総合スコア14

WordPress

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/03/01 09:50

編集2021/03/01 09:53

前提・実現したいこと

掲題の通りですが、Wordpressで複数のカスタム投稿タイプで共通のタクソノミーを使用しています。
タームのアーカイブページを作成する際に、投稿タイプごとで異なるレイアウトにしたい場合、phpファイルをどのように作成すればよいのでしょうか。

経緯

Custom Post Type UIで、
・投稿タイプA
・投稿タイプB
・投稿タイプC
を作成しました。

そこに以下の共通のタクソノミーを設定しました。

タクソノミーZ
├ タームaa
├ タームbb
└ タームcc

共通にした理由は、投稿タイプAでタームaaのアーカイブページを作成する際に、
そのページ内に同じタームaaに関する投稿タイプB/Cの記事を出力させたかったからです。

はじめは投稿タイプA・B・Cすべてに別のタクソノミーを設定していました。(タームの値はまるっきり同じですが)
というのも、各投稿タイプでレイアウトが異なるようにしたかったため、
taxonomy-タクソノミーA.php、taxonomy-タクソノミーB.php、taxonomy-タクソノミーC.php
といった異なるレイアウトのphpを作成しました。

しかし、投稿タイプAのタームaaのアーカイブページで、同じタームaaに絞った投稿タイプB/Cの記事を出力させたいときにタームの値を取得できず、調べた結果共通のタクソノミーにしたほうが良いと判断しました。
参考サイト

発生している問題

そこで掲題の件ですが、共通のタクソノミー(タクソノミーX)にした場合、phpは
taxonomy-タクソノミーX.php
となりますが、各投稿タイプで違うレイアウトを充てたい場合はどうすればよいのでしょうか。
phpファイルをスタイルごとに作成することはできるのでしょうか。

補足情報(FW/ツールのバージョンなど)

WordPress 5.6.2です。
知識不足で恐縮ですが、よろしくお願いいたします。

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

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

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

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

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

ztj

2021/03/03 00:18 編集

アドバイスをいただき、追記です。 現状、共通のタクソノミー(タクソノミーX)のみですので、taxonomy.phpで投稿タイプ別の条件分岐を記述しようとしています。 taxonomy.phpの中身は以下です。 <?php get_header(); ?> <?php if ('news' == get_post_type() ){ get_template_part( "content", "news"); } <?php get_footer(); ?> もし投稿タイプが"news"の場合、同階層の"content-news.php"を読み込む としたいのですが、ヘッダーフッターは読み込んでいるもののなぜかcontent-news.phpを読み込めません。 分岐の仕方が間違っているのでしょうか。
guest

回答1

0

ベストアンサー

レイアウトが異なる部分だけテンプレートを小分けにして
get_template_partで必要なテンプレートをincludeさせます。
確か最近になって、この関数に引数を渡せるようになったはずなので、
タクソノミーを識別する文字列を渡してやれば良いでしょう。

投稿2021/03/01 12:57

yuki84web

総合スコア1857

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

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

ztj

2021/03/02 04:20

ご回答いただき、ありがとうございます。 恥ずかしながらget_template_partを知らなかったのですが、こんな便利な関数があったのですね。 恐れ入りますがもう少し詳しく教えていただきたいのですが、 タクソノミーを識別する文字列とは具体的にどういったものでしょうか。 タクソノミーは1つしかないのですが、識別するというのがよくわかりません。
yuki84web

2021/03/02 12:19

すみません、多分見当違いのことを書きました。「各投稿タイプで違うレイアウトを~」とあるので、投稿タイプ条件にして処理を分岐すればよいと思います。
ztj

2021/03/02 15:01

ご返信ありがとうございます。 理解しました。 何度も質問して申し訳ございませんが、もう少し詳しく教えてください。 現状、共通のタクソノミー(タクソノミーX)のみですので、taxonomy.phpで投稿タイプ別の条件分岐を記述しようとしています。 taxonomy.phpの中身は以下です。 <?php get_header(); ?> <?php if ('news' == get_post_type() ){ get_template_part( "content", "news"); } <?php get_footer(); ?> もし投稿タイプが"news"の場合、同階層の"content-news.php"を読み込む としたいのですが、ヘッダーフッターは読み込んでいるもののなぜかcontent-news.phpを読み込めません。 分岐の仕方が間違っているのでしょうか。 何度も申し訳ありませんが、教えていただけますでしょうか。
yuki84web

2021/03/03 11:48 編集

get_post_type()の戻り値はnewsになってますか?他の方法としてget_query_var( 'post_type' )で投稿タイプを取得してみてください。
ztj

2021/03/08 02:57

何度も申し訳ございません。 content-news.phpが読み込めない、というのは解決したのですが、投稿タイプ別に条件分岐ができません。 >get_post_type()の戻り値はnewsになってますか? こちらですが、newsになるときとならないときとがあります。 具体的に申し上げますと、「news」と「release」の投稿タイプがありまして、 それらで共通のタクソノミー「name」を使用しています。 各投稿タイプで絞り込みをかけたときの挙動をtaxonomy.phpに記しています。 <?php echo get_post_type(); //デバック用に if ('news' == get_post_type() ){ get_template_part( "content", "news"); //投稿タイプがnewsなら~ } if ('release' == get_post_type() ){ get_template_part( "content", "release"); //投稿タイプがreleaseなら~ } ?> 投稿タイプreleaseで絞り込みをかけてtaxonomy.phpを読み込むと、 releaseにしか記事がないタームの場合、echoの部分で「release」を返してくれるのですが、 newsとreleaseどちらにも記事があるタームで絞り込むと、 投稿タイプがreleaseの場合でも、releaseよりnewsが優先され、「news」が返ってきます。 上記コードのnewsとreleaseの順番を上下逆にしてもreleaseよりnewsが優先されます。 >他の方法としてget_query_var( 'post_type' )で投稿タイプを取得してみてください。 参考にさせて頂き、taxonomy.phpで以下のコードに差し替えてみました。 $taxonomy = get_query_var( 'taxonomy' ); $post_type = get_taxonomy( $taxonomy )->object_type[0]; echo $post_type; //デバック用に if ('news' == $post_type ){ get_template_part( "content", "news"); //投稿タイプがnewsなら~ } if ('release' == $post_type ){ get_template_part( "content", "release"); //投稿タイプがreleaseなら~ } しかし、先ほどと同様に投稿タイプreleaseで絞り込みをかけると releaseにしか記事のないタームでもnewsを返します。 共通タクソノミーでテンプレートを分ける方法を調べてもなかなか出てこず、 何度も恐縮ですがご教授いただけますでしょうか。 足りない情報がありましたらご指摘ください。
yuki84web

2021/03/08 13:47

get_query_var( 'taxonomy' )ではなくget_query_var( 'post_type' )を試していただきたいです
ztj

2021/03/22 09:15

返信が遅くなり申し訳ありません。 Custom Post Type Permalinksを使っていたため、最終的にディレクトリ名で条件分岐させることで解決しました。 if(strpos($url,'news') !== false){ get_template_part( "content", "news"); } 上記記述で無事各テンプレートを読み込むことができました。 get_template_partについて教えてくださりありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問