サポート » 使い方全般 » タクソノミーのターム(term)に投稿スラッグを代入したい

  • 解決済 LVP8

    (@lvp8)


    プラグイン「Simple Taxonomies」を利用してタクソノミーに挑戦しています。

    ■現状(例 : 映画俳優を紹介するサイト)

    http://example.com/ : トップページ

    http://example.com/introduce/ (カテゴリー : 人物紹介)
    http://example.com/introduce/will-smith/ (記事 : ウィル・スミスの紹介)

    http://example.com/news/ (カテゴリー : 関連ニュース)
    http://example.com/news/20090910-0523/ (記事 : 1)
    http://example.com/news/20090909-2343/ (記事 : 2)

    上記のような構成のサイトだとして、ニュースカテゴリの記事に「誰の関連記事なのか」をタクソノミーを使い割り当てたいと考えています。

    例えば、ニュースカテゴリの記事1が「ウィル・スミス」の関連ニュースだとして、
    ・taxonomy を people
    ・term を will-smith
    とすれば、http://example.com/people/will-smith/ にその記事がリスト表示されます。

    また、下記のような記載をすれば、「people」という taxonomy の「will-smith」という term が付いた記事を10件表示できる事は理解できました。

    <?php query_posts( array( 'people' => 'will-smith', 'showposts' => 10 ) ); ?>

    ■やりたい事

    ウィル・スミスを紹介したシングルページ「http://example.com/introduce/will-smith/」に、ウィル・スミスの関連記事(term に will-smith が付いた記事)を表示したい。

    single.php に、

    <ul>
    <?php query_posts( array( 'people' => 'スラッグ', 'showposts' => 10 ) ); ?>
    <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
    <li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
    <?php endwhile; else: ?>
    <li>関連ニュースはありませんでした。</li>
    <?php endif; ?>
    </ul>

    と記載し、( ‘people’ => ‘スラッグ‘, ‘showposts’ => 10 ) )

    この スラッグ の部分に、現在表示してあるシングルページのスラッグを代入したいと考えています。
    また、コードの記載方法の間違いや問題点(投稿スラッグと term は同じにすべきでないなど)はありますでしょうか。

    長くなりましたが、アドバイスいただければと思います。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • モデレーター jim912

    (@jim912)

    LVP8さん、こんにちは。

    投稿スラッグは、$post->post_nameで取得できます。
    それと、提示いただいたコードですが、peopleはカスタムタクソノミーなので、

    <?php query_posts( array( 'taxonomy' => 'people', 'term' => $post->name, 'showposts' => 10 ) ); ?>

    になるのではなかろうかと思います。

    投稿スラッグとtermが同一になることについては、パーマリンクの設定がpost_idを利用されているようですので問題ないかと思います。

    それと、もしもquery_postsを使った後の表示(サイドバー、フッターなど)がおかしいようであれば、query_postsではなく、get_postsを使うようにしてください。

    LVP8

    (@lvp8)

    jim912さん

    先日お世話になったばかりですが、今回も適切なアドバイスありがとうございます。

    あえて面倒なことはおっしゃらなかったと思うのですが、やはり「query_posts」ですと不具合がでたので get_post を試したのですが、プラグインの影響なのか表示されませんでした。

    <?php if (have_posts()) : the_post(); ?>
    
    <h1><?php the_title(); ?></h1>
    
    <dl>
    <dt>カスタムA</dt>
    <dd><?php echo get_post_meta($post->ID,'カスタムフィールドA',true); ?></dd>
    <dt>カスタムB</dt>
    <dd><?php echo get_post_meta($post->ID,'カスタムフィールドB',true); ?></dd>
    </dl>
    
    <!-- 本当はここに関連ニュースを表示させたい -->
    
    <?php the_content(); ?>
    
    <?php comments_template(); ?>
    
    <?php endif; ?>
    
    <h2><?php the_title(); ?> の関連ニュース</h2>
    <ul>
    <?php query_posts( array( 'taxonomy' => 'people', 'term' => $post->name, 'showposts' => 10 ) ); ?>
    <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
    <li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
    <?php endwhile; else: ?>
    <li>関連ニュースはありませんでした。</li>
    <?php endif; ?>
    </ul>

    上記のように、ループの外側に記載すれば正常に表示されるのですが、本位の場所ではありません。
    本来表示させたい位置に挿入すると、その下の「the_content」や「コメント」に不具合がでます。

    get_post で表示されない理由、query_posts の場合の不具合解消、はありますでしょうか。
    解決方法がなければレイアウトを見直したり( the_content などの配置変え)や、CSS(position)で強引にその場所に表示させることを考えたいと思います。

    モデレーター jim912

    (@jim912)

    LVP8さん、こんにちは。

    今回の不具合は2点あって、
    1点がquery_postsによる変数$postsの上書き、2点目がループ内で再度ループを行うことによる$id, $post, $more, $page等々変数の上書きです。

    これを回避させるには、上書される変数を別名の変数に待避させておいて、内部ループ終了後に戻す処理を行うか、そもそもそれらの変数が上書きされないようにすることです。

    今回はget_postsを使った、後者の方法を採ってみます。

    <ul>
    <?php
    $related_news = get_posts( array( 'taxonomy' => 'people', 'term' => $post->post_name, 'showposts' => 10 ) );
    if ( $related_news ) :
    foreach( $related_news as $r_news ) : ?>
    	<li><a href="<?php echo get_permalink( $r_news->ID ); ?>"><?php echo esc_html( $r_news->post_title ); ?></a></li>
    <?php endforeach; else : ?>
    	<li>関連ニュースはありませんでした。</li>
    <?php endif; ?>
    </ul>

    ちなみに、先の返答で不具合云々と申し上げたのは、今回の不具合とは若干異なり、query_postsを使うと条件分岐タグに影響を与えるという点です。詳細については別のスレッドにて回答させていただいたことがありますので、興味がありましたらそちらをご覧ください。

    検索結果を記事中に表示したい

    それと、おまけですが、get_postは引数にidを指定して単一の記事を取得する関数。get_postsは、引数にquery_postsと同じ引数を指定して、複数の記事を取得する関数です。ネーミングはsの有無だけなのですが、機能は全く異なりますので見間違えないようにしてくださいね。

    LVP8

    (@lvp8)

    jim912さん
    思い通りの表示ができました。ありがとうございます。

    jim912さんのおっしゃってることは何となく分かっても、その原因や過程、解決方法を理解するスキルを持ち合わせていません。
    実は、リンク先のトピックも、最初の回答をいただいた後発見し、色々と試行錯誤していたのですが、結局思い通りにならずに追加返信を行ったしだいです…。

    いずれにしましても、貴重なお時間を割いてお答えいただいた事と、「もう少し踏み込んで知識を深めよう」という気持ちにさせていただいた事に感謝いたします。

    ありがとうございました。

    jim912さん のおかげで思い通りの表示になったのですが、日付の表示で行き詰ってしまいました。

    <?php $related_news
    ~~中略~~
    
    <span><?php the_time('Y/m/d'); ?></span> <a href="<?php echo get_permalink( $r_news->ID ); ?>"><?php echo esc_html( $r_news->post_title ); ?></a>
    
    ~~中略~~
    <?php endif; ?>

    とした場合、関連ニュースを投稿した日付ではなく、表示されている人物紹介ページを投稿した日付になってしまいます。

    jim912さんにいただいたコードを参考に、

    <span><?php echo($r_news->post_date); ?></span>

    とすれば関連ニュースの日付を取得できましたが、データベースに格納されているまま表示されます。
    2009-07-31 15:30:18

    不具合の可能性があったり、コードが複雑になるようであれば無理に表示するつもりはありませんが、これを Y/m/d 形式にする方法はありますでしょうか。

    モデレーター jim912

    (@jim912)

    LVP8さん、こんにちは。

    <span><?php echo mysql2date( 'Y/m/d', $r_news->post_date ); ?></span>

    で直るかと思います。

    jim912さん、何度も助けていただいてありがとうございます。
    東京方面にお辞儀をして、F1が盛り上がるよう祈りました。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • トピック「タクソノミーのターム(term)に投稿スラッグを代入したい」には新たに返信することはできません。