サポート » 使い方全般 » 固定ページで特定のカテゴリーに属したタグ名を表示したい

  • 解決済 syoshin

    (@syoshin)


    いつもお世話になっています。

    現在固定ページ(ID350)にカテゴリーID30の投稿(タイトルとカスタムフィールドの画像)を表示しています。

    page-350.php のカテゴリーID30の表示部分 ↓

    <?php
    $cat_id = 30;
    $list = "numberposts=15&category=".$cat_id;
    $posts = get_posts($list);
    foreach($posts as $post) :
    setup_postdata($post);
    ?>
    <div class="クラス名1"><h3><a title="<?php the_title(); ?>" href="<?php the_permalink(); ?>" id="post-<?php the_ID(); ?>"><?php the_title(); ?></a></h3>
           <div class="クラス名2">
            <img src="<?php bloginfo('url'); ?>/img/hoge/<?php echo c2c_get_custom('キー名','','','画像名.jpg'); ?>" alt="<?php the_title(); ?>の画像" />
             </div>
      </div>
    <?php endforeach; ?>

    上記コードはフォーラムで見かけたものを参考にさせていただきました。
    (随分前の事なので、どのトピックかは探しだせませんでした。)

    上記は横5×縦3のボックスで並べています。

    このほかに、カテゴリーID40に属したタグ名を同じように表示しているのですが、
    PHPに疎いため、下記のように直接URLを記述しています。

    <div class="クラス名1">
    <h3><a href="<?php echo get_tag_link(55); ?>">タグ名5</a></h3>
    <div class="クラス名2"><img src="<?php bloginfo('url'); ?>/img/hoge/画像名2.jpg" alt="<?php the_title(); ?>の画像" /></div>
    </div>
    
    <div class="クラス名1">
    <h3><a href="<?php echo get_tag_link(80); ?>">タグ名8</a></h3>
    <div class="クラス名2"><img src="<?php bloginfo('url'); ?>/img/hoge/画像名5.jpg" alt="<?php the_title(); ?>の画像" /></div>
    </div>
    
    以下略
     .
     .

    [サイドバーの記述]

    <ul>
    <li><a href="<?php echo get_tag_link(55); ?>">タグ名5</a></li>
    <li><a href="<?php echo get_tag_link(80); ?>">タグ名8</a></li>
    以下略
     .
     .
    </ul>

    この方法だと毎回カテゴリーID40に属したタグが増えるたびに追加していかなければならないのでとても大変なのです。

    もっと簡単な方法がありましたらご教授願えませんでしょうか?

    親カテゴリー:(ID4)
    |
    |_子カテゴリー:(ID30)
    |
    |_子カテゴリー:(ID40)

    1.子カテゴリー ID30,40の下に階層はありません。これからも増やす予定はありません。
    2.子カテゴリー ID30,40に属した投稿はそれぞれ親カテゴリー(ID4)にも属しています。
    3.カスタムフィールドの画像はアップロード機能は利用せず、サイト直下のイメージフォルダの画像を指定しています。
    4.カスタムフィールドの表示にGet Custom Field Valuesを使っています。
    5.タグ名のカスタムフィールドの画像は一番最初の投稿の画像を表示
    6.子カテゴリー ID30,40に属するタグ名はそれぞれ分かれていて両方に属するタグはありません。

    説明が下手で申し訳ないのですが、私のやりたいことが伝わりますでしょうか?
    他に何か足りない情報があれば追加します。

    よろしくお願いします。

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

    (@jim912)

    syoshinさん、こんにちは。

    認識が違っていたら指摘ください。
    カテゴリーID40に属している全ての投稿で使われているタグを取得したいのですよね。

    と言っても言うほど簡単ではなかったりするのですが、、、
    手順としては、

    1. カテゴリー40に属している投稿のIDを全て取得する。
    2. 取得した投稿が属しているタグを重複せずに取得する

    という2段階の手順になります。
    これらの手順を都合良く取得できる関数が実装されているか、私は知りませんので、データベースへのクエリーを直に書いて取得してしまうことにします。

    ■テーマのfunctions.phpに下記を追記

    function get_all_tags_in_category( $cat_id = 1 ) {
    	global $wpdb;
    
    	$cat_id = (int)$cat_id;
    	$sql = "SELECT $wpdb->term_relationships.object_id FROM $wpdb->term_relationships, $wpdb->term_taxonomy WHERE $wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id AND $wpdb->term_taxonomy.taxonomy = 'category' AND $wpdb->term_taxonomy.term_id = $cat_id";
    	$results = $wpdb->get_results( $sql, 'ARRAY_A' );
    	$cat_post_ids = array();
    	foreach ( $results as $result ) {
    		$cat_post_ids[] = $result['object_id'];
    	}
    	$cat_post_ids = implode( ', ', $cat_post_ids );
    	$sql = "SELECT DISTINCT $wpdb->terms.* FROM $wpdb->term_relationships, $wpdb->term_taxonomy, $wpdb->terms WHERE  $wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id AND $wpdb->term_taxonomy.term_id = $wpdb->terms.term_id AND $wpdb->term_taxonomy.taxonomy = 'post_tag' AND $wpdb->term_relationships.object_id IN ( $cat_post_ids ) ORDER BY $wpdb->terms.term_id ASC ";
    	$results = $wpdb->get_results( $sql );
    	return $results;
    }

    ■テンプレートには、下記の様な感じで記述

    <?php
    $cat_tags = get_all_tags_in_category( 40 );
    foreach ( $cat_tags as $cat_tag ) :
    ?>
    		<div class="class_1">
    			<h3><a href="<?php echo get_tag_link( $cat_tag->term_id ); ?>"><?php echo esc_html( $cat_tag->name ); ?></a></h3>
    			<div class="class_2"><img src="<?php bloginfo('url'); ?>/img/hoge/tag_image_<?php echo $cat_tag->term_id; ?>.jpg" alt="<?php the_title(); ?>" /></div>
    		</div>
    <?php endforeach; ?>

    なお、get_all_tags_in_category();関数は、データベースへのクエリを伴う重い処理になるので、なるべく使用回数を控えてください。

    サイドバーが同じテンプレート上に記述されているのなら、$cat_tags 変数をそのまま利用できますし、get_sidebar();で呼び出されている場合でも、サイドバーのテンプレートに

    global $cat_tags;

    を記述していただければ、get_all_tags_in_category();関数を使わずに、ループの処理だけですませられます。

    スレッド開始 syoshin

    (@syoshin)

    jim912様

    上記のコードでタグ名の取得は出来るようになりました!
    …が、画像の表示が上手くいきません。

    tag_image_<?php echo $cat_tag->term_id; ?>.jpgだと、

    tag_image_55.jpgのようになりますが、画像名の数字はダグIDとは一致しないので(画像名に数字を使っていない画像もあるので)表示ができませんでした。

    ためしにGet Custom Field Valuesを使って、カスタムフィールドの画像のキー名を下記のように入れてみました。

    <img src="<?php bloginfo('url'); ?>/img/hoge/<?php echo c2c_get_custom('カスタムフィールド画像のキー名','','','hoge.jpg'); ?>" alt="<?php echo esc_html( $cat_tag->name ); ?>の画像" />

    上記だとhoge.jpgの画像は表示されるのですが、hoge.jpgはカスタムフィールドの値が無かった時の代替画像なので、固定ページ(ID350)のカスタムフィールド画像の値を出力していると言う事ですよね?

    ID40に属したタグ名のカスタムフィールド画像のキー名の値を取得するにはどのようにしたらよいのでしょうか?

    カテゴリーID40に属している全ての投稿で使われているタグを取得したいのですよね。
    と言っても言うほど簡単ではなかったりするのですが、、、

    と言う事は、これも簡単にはいかないのでしょうか。

    それと、サイドバーはget_sidebar();で呼び出していますが、global $cat_tags;をどの様に記述したらよいのかわかりませんでした。

    お手数ですが、引き続きよろしくお願いいたします。

    ※ちなみにID40のalt=”<?php the_title(); ?>”の部分はalt=”タグ名”でした。(寝ぼけてました、、、私)

    スレッド開始 syoshin

    (@syoshin)

    追記です。

    <?php echo $cat_tag->term_id; ?>
    を
    <?php echo $cat_tag->slug; ?>

    に変更したところ無事画像が表示されました。

    ですが、この場合必ず画像の一部にタグスラッグ名を入れる必要があるので
    うっかり忘れる事もありそうです。

    ですので、できればID40に属したタグ名のカスタムフィールドの画像のキーの値で
    取得できれば助かります。

    モデレーター jim912

    (@jim912)

    syoshinさん、こんにちは。

    カスタムフィールドは、投稿・ページに付随するデータの保管場所になるので、タグの画像名をこちらで管理すべきではありません。
    やろうと思えば、出来なくはないですが、そのためにはカテゴリー40に属する投稿データを全て精査しなければならなくなるため、非現実的な実装となります。

    数字での管理が分かりにくいのであれば、slugをつけるのを忘れないようにし、なるべく入力の手間を省きたいのであればidを用いるべきでしょう。

    global $cat_tags;については、sidebar.phpのphp開始タグの直後に記述してください。

    <?php
    global $cat_tags;

    スレッド開始 syoshin

    (@syoshin)

    jim912様 こんにちは。

    やろうと思えば、出来なくはないですが、非現実的な実装となります。

    そうなんですね。了解しました。

    最初に比べたら随分楽になったのに、もっと楽ができないかとついつい欲がでてしまいた。

    サイドバーの事なんですが、

    <?php
    global $cat_tags;

    の後に記述するコードがわからなかったのです、、、。

    フォーラムを見ていてこちらのmizube様の書かれているコードが、
    タグ名に当てはまる投稿のタイトルが自動で表示されるので
    (タグが追加される度にタグ名を入力する必要がありますが)
    投稿タイトルもわかるのでいいなと思ったのですが、
    投稿タイトルが日時の新しい順から表示されているので、
    タイトルを日時の古い順から表示したいのですがどのようにしたらよいのでしょうか?

    Codexとか見てもさっぱり理解できず
    orderbyとか使うんでしょうかね…

    global $cat_tags; とは違う質問になってしまって申し訳ないのですが、
    お手すきの時にでもお答え頂ければ幸いです。

    の後に記述するコードが

    sidebar.php を開いて上から見ていって、始めに出てくる <? の後に
    global $cat_tags; を追加しておけば、以降 sidebar.php で
    $cat_tags = get_all_tags_in_category( 40 );
    と再度 get_all_tags_in_category を呼ばなくても、

    foreach ( $cat_tags as $cat_tag ) :
    ?>
      <div class="class_1">
        <h3><a href="<?php echo get_tag_link( $cat_tag->term_id ); ?>"><?php echo esc_html( $cat_tag->name ); ?></a></h3>
        <div class="class_2"><img src="<?php bloginfo('url'); ?>/img/hoge/tag_image_<?php echo $cat_tag->term_id; ?>.jpg" alt="<?php the_title(); ?>" /></div>
      </div>
    <?php endforeach; ?>

    と書くだけで良いですよ、という意味です。
    get_all_tags_in_category を呼ぶのはWordPressにとって大変な作業なので
    何度も呼ばないようにしてあげようという心遣いです。

    タイトルを日時の古い順から

    order を 昇順(日付の小さい=古い順)にします。

    $my_args  = array(
            'cat' => get_query_var( 'cat' ),
            'tag__and' => array( $tag_ID ),
            'order' => 'ASC'
        );

    日付の順を明示するなら
    'orderby' => 'date'
    'order' => 'ASC',(※コンマを付けること)の後にさらに追加してください。

    ※表現が適切でない、などは大目に見てください > all。

    スレッド開始 syoshin

    (@syoshin)

    kz様

    わかりやすく説明していただきありがとうございます。

    やっと意味が理解できました!

    最初自分でorderを追加してみたのですが
    'order' => 'DESC'にしてたので変わるわけがないですよね。

    ASCとDESCの意味を逆に捉えていました。(恥ずかしい、、、)

    お正月休みを全てWPのカスタマイズに費やしてしまいましたが大変勉強になりました。

    jim912様、kz様

    この度は本当にありがとうございました。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • トピック「固定ページで特定のカテゴリーに属したタグ名を表示したい」には新たに返信することはできません。