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

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

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

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

Q&A

解決済

1回答

4176閲覧

WordPress の taxonomy.php でリストが表示されない

minpanpy

総合スコア16

WordPress

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

0グッド

0クリップ

投稿2017/02/02 07:13

編集2017/02/13 07:46

###前提・実現したいこと
新たに作ったカスタム投稿タイプ 'example_B_post_type' があり、
taxonomy.php でタームが割り当てられた記事一覧を表示したい。

###発生している問題・エラーメッセージ
うまくいっているカスタム投稿タイプ 'example_A_post_type' に続き、新たに 'example_B_post_type' を作りました。
プラグイン「Custom Post Type UI」と「Custom Post Type Permalinks」を使って作っています。

記事を書いて公開し、タームを付けても新たに作った方の投稿タイプのみ taxonomy.php で表示されません。

'example_A_post_type' の方は if (have_post()) のメインループに記事が入ってくるのですが、
'example_B_post_type' の方はメインループが空になってしまいます。

記事はありません。

###該当のソースコード

php

1 2<?php 3 if ( have_posts() ) : 4 while ( have_posts() ) : the_post(); 5?> 6 7the_title(): <?php the_title(); ?> 8 9<?php 10 endwhile; 11 else : 12?> 13記事はありません。 14<?php 15 endif; 16?>

###試したこと
カスタム投稿の管理画面で記事が公開状態になっていることは確認し、タームの管理画面上でカウントの欄が1 になっています。
続いて「表示」リンクをマウスオーバーすると出て来る http://www.example.com/example_B_post_type/testB/hogehoge からアクセスしていますが、記事一覧が表示されません。

なお、うまくいく方の投稿タイプは同じ taxonomy.php で表示されます。
http://www.example.com/example_A_post_type/testA/hogehoge はOK)

CPT UI の「登録済み投稿タイプ/タクソノミー」のパラメータもうまくいく方と同一にそろえてあり、
パーマリンクの空上書きも何度もしています。アパッチの再起動もしました。

<?php print_r($wp_query); ?> を taxonomy.php で実行すると

WP_Query Object で
うまくいくA は
[post_count] = 1ですが、
うまくいかないB は
[post_count] = 0 となっています。(カスタム投稿の管理画面では記事があるのに)

そのため、$post 自体が出てこないので、if (have_post()) に引っかからないのだと思います。

WP_Term Object ではA, B共に
[count] = 1 となっています。

どのようにすれば $post が生成され、メインループに出てくるようになるでしょうか?

###補足情報(言語/FW/ツール等のバージョンなど)
WordPress v4.5.6
Custom Post Type UI v1.4.3
Custom Post Type Permalinks v2.2.0

CPT UIの設定画面

その後、WordPress が生成する SQL を見てみたところ、

...中略... ) AND ( wp_postmeta.meta_key = 'hogehoge' ) AND wp_posts.post_type = 'example_B_post_type' (以下略)

というSQLになっており、こちらの 'hogehoge' は 他のカスタム投稿A に設定しているもので、B では使っていないものがSQLに入っていることが分かりました。

MySQL につなぎ、この部分を抜いたSQL を実行すると、求めている結果が得られました。(1歩前進)

ただ、なぜ使っていないカスタムフィールドが条件に入るのかが分からず、どこを修正すれば良いのか分からず困っています。

ためしに、hogehoge をAdvanced Custom Fields管理画面上で消してみましたが、SQLは変わらずでした。

なにか心当たりありましたら、ご教示いただければ幸いです。

うまくいかないSQL SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) WHERE 1=1 AND ( wp_term_relationships.term_taxonomy_id IN (154) ) AND ( wp_postmeta.meta_key = 'hogehoge' ) AND wp_posts.post_type = 'example_a_post_type' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_postmeta.meta_value DESC, wp_posts.post_date ASC LIMIT 0, 50;
うまくいくSQL SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) WHERE 1=1 AND ( wp_term_relationships.term_taxonomy_id IN (154) ) AND wp_posts.post_type = 'example_a_post_type' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_postmeta.meta_value DESC, wp_posts.post_date ASC LIMIT 0, 50;

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

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

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

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

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

8-0_nyan5

2017/02/02 07:56

画像が設定したカスタム投稿のものですか?has_archiveがfalseになってますよ。
minpanpy

2017/02/02 08:04

回答ありがとうございます。画像はカスタム投稿タイプのものでA, B 共に同じ設定状況です。has_archive は false, true どちらにしても変わりませんでしたので、false にもどしました。 都度、パーマリンクの空上書きもしています。 うまく行っているカスタム投稿タイプA の方も false のままで $post を取得でき、表示できている状況です。
退会済みユーザー

退会済みユーザー

2017/02/02 08:29

functions.phpには、投稿表示に関わりそうなコードは一切ありませんか?
minpanpy

2017/02/02 09:53

回答ありがとうございます。function.php にカスタム投稿タイプ、タクソノミーに関する記述、フックする記述はしていない状況です。
退会済みユーザー

退会済みユーザー

2017/02/13 08:06

カスタムフィールドは何かのプラグインで追加したものでしょうか? またよろしければ、当方の環境で再現試験をしてみたいので、「管理画面 > CPT UI > インポート/エクスポート > コードを取得」で取得できる、PHPのコードを記載していただけないでしょうか? 可能であればカスタムフィールドについてもお願いします。
minpanpy

2017/02/15 11:09

仮想サーバーを立て、私の方でもエクスポート、インポートをしてみました。新しいサーバーでは意図する通りに表示可能でした。そのため、カスタム投稿タイプ以外の原因があると思い、関係するところを1から見直したところ、自己回答にあるとおりfunction.php に原因があり問題の解決に至りました。たくさんのご指摘・ご指南をいただき誠にありがとうございました。
guest

回答1

0

自己解決

解決しました。

function.php にて pre_get_posts を使う箇所で以下の記述があり、そちらをコメントアウトで解決しました。

function pre_get_posts_custom($query) { if ($query->is_tax()) { $query->set('meta_key', 'hogehoge'); // ← コレが原因。どのタクソノミーでも検索条件に入ってくる } } add_action('pre_get_posts', 'pre_get_posts_custom');

質問用に 'hogehoge' としておりましたが、実際は予約語的な一般名詞にしていたため、検索にヒットしすぎで見落としておりました。今後は命名に気をつけます。

miz 様 多くのご指摘、ご指南をいただき誠にありがとうございました。

投稿2017/02/15 11:04

minpanpy

総合スコア16

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問