人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

ワードプレスのカスタム投稿で同一タームの記事一覧をアーカイブテンプレートページへ表示させる為に下のようなコードを用いていますが、表示させたいサブカテゴリーの記事が未投稿の場合にエラーが出てしまいます。

未投稿の場合はエラーが出ないようにするには下コードをどのように変更すればよろしいでしょうか?(未投稿の場合は空白状態で構いません)全く別のコードになっても構いませんので教えて下さい。

<?php
$term = array_shift(get_the_terms($post->ID, 'タクソノミー名'));
?>
<?php $tax_posts = get_posts('post_type=ポストタイプ名&taxonomy=タクソノミー名&term='.esc_html($term->slug)); if($tax_posts): ?>
<ul>
<?php foreach($tax_posts as $tax_post): ?>
<?php if ($post->ID != $tax_post->ID): ?>
<li><a href="<?php echo get_permalink($tax_post->ID); ?>"><?php echo esc_html($tax_post->post_title); ?></a></li>
<?php else: ?>
<li><?php echo esc_html($tax_post->post_title); ?></li>
<?php endif; ?>
<?php endforeach; ?>
</ul>
<?php endif; ?>

以上です。

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

●質問者: kamefactory
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● rouge_2008
●100ポイント ベストアンサー

前回の質問(http://q.hatena.ne.jp/1382148601)の返信コメントでの追加質問に関する問題でしょうか?(※コメント通知が届かなかった為、確認が遅くなりました。)

親ターム(カテゴリー)「sf」とは違って、「japan」ターム(カテゴリー)あるいは「usa」タームなど子タームのアーカイブページにアクセスした場合は、同一タームの記事一覧のみ表示されればいいのですね?
同一タームのみ表示されればいいのでしたら、デフォルトのクエリーで表示されますので、「query_posts()」でクエリーを変更したり、「get_posts()」で新規にループを作成する必要はありません。
「Twenty Twelve」や「Twenty Thirteen」などデフォルトのテーマの「archive.php」や「category.php」を参考にしてみてください。


<?php if ( have_posts() ) : ?><!-- この記述以降が記事がある場合の処理ですが、「get_posts()」で作成したループの場合は、質問文のコードのように返り値を代入した変数で判別します。 -->
<ul>
<?php while ( have_posts() ) : the_post(); ?>

<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; ?>
</ul>

<?php else : ?>

<!-- ここに記事がない場合の処理 -->

<?php endif; ?>



※質問文のコードでは、記事がない場合にも「$term = array_shift(get_the_terms($post->ID, 'タクソノミー名'));」の行で記事IDを利用して処理が実行されるのでエラーになっているのではないかと思います。


rouge_2008さんのコメント
※一部HTMLと判定されて消えていたので、再度投稿し直します。 「taxonomy.php」にまとめて記述する場合、親ターム用と子ターム用のアーカイブのテンプレートを2つ作成し、「get_template_part()」を使用して読み込むテンプレートを分けると良さそうです。 用意するテンプレートが最小で済みますし、「taxonomy.php」の可読性も下がりません。 ・「taxonomy.php」 >|| <?php if ( have_posts() ) : ?> <?php // 「sf」等、親タームのスラッグを指定します。 if( is_tax( 'bookcat', array( 'sf', 'other-term-slug2', 'other-term-slug3' ) ) ) get_template_part( 'tax-parent' ); //「tax-parent.php」を読み込みます。 // 「japan」等、子タームのスラッグを指定します。 if( is_tax( 'bookcat', array( 'japan', 'usa', 'other-term-slug' ) ) ) get_template_part( 'tax-child' ); //「tax-child.php」を読み込みます。 ?> <?php else : ?> <!-- ここに記事がない場合の表示 --> <?php endif; ?> ?> ||< ※「sf」等の親ターム用として「tax-parent.php」、「japan」等の子ターム用として「tax-child.php」を用意してあるものとします。 ※「tax-parent.php」には、前回の回答の1番目のコードの場合はそのまま全部、2番目のコードの場合は最初の「if($wp_query->queried_object->parent == 0) : 」と最後の「&lt;?php endif; ?&gt;&lt;!-- End of If parent category --&gt;」だけ除いてすべて記述します。 ※「tax-child.php」には、上記回答のコードの「&lt;?php if ( have_posts() ) : ?&gt;」および「&lt;?php else : ?&gt;」?「&lt;?php endif; ?&gt;」は不要です。

kamefactoryさんのコメント
丁寧な解説、いつもありがとうございます! おっしゃる通り前回の質問の追記に関する質問でした。 おかげさまで無事希望通り表示させることができました。より可読性の高い方法まで教えていただき本当に感謝しております。 またご教授頂くこともあるかと思いますが、何卒よろしくお願いいたします。 本当にありがとうございます!!

kamefactoryさんのコメント
すいません。 子タームへの投稿がない時にエラーにならなくなったのですが、同一子タームに投稿すると、新しい投稿が上書きされてしまい、子ターム一覧ページに最新の投稿のみが表示されてしまいます。一覧表示させるのは上記コードをどう変更すればよいでしょうか? ちなみに一番最初の質問時に回答していただいたコードでは、同一ページ内にそれぞれのターム毎の一覧が表示されています。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ