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

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

ただいまの
回答率

89.97%

Wordpressの上位カテゴリアーカイブページで各下位カテゴリへのリンクを用意したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 860

ann

score 10

いつもお世話になってます。
Wordpressの質問です。
ご存知の方、いらっしゃいましたら教えてください(>_<)

【やりたいこと】
カテゴリを階層型に作っています。
階層は2階層であると考えてください。
そのカテゴリの上位のカテゴリのアーカイブページでは、記事ではなく下位カテゴリの表示をしたいのです。
そして、その下位カテゴリに含まれる記事のサムネイル画像を代表して一枚表示したいと思っています。

【例】
現在、このようなカテゴリ構成になっているとします。

野菜(第一階層)
├なすび(第二階層)
│├千両茄子(記事)
│├長茄子(記事)
│├米茄子(記事)
│└サファイヤ茄子(記事)
├レタス(第二階層)
│├玉レタス(記事)
│├サニーレタス(記事)
│└サラダ菜(記事)
├ニンジン(第二階層)
:(略)

このとき、「野菜」カテゴリのリンクをクリックした際に表示されるページにには
「なすび」と「レタス」と「ニンジン」を表示したいのです。
そして、それぞれのカテゴリのサムネイル画像として、含有記事のサムネイル(どれかは問いませんが、例えば長茄子と玉レタスの画像)を取得したいと思っています。

【質問点】
1.下位カテゴリのリンクは多分、現在のカテゴリIDを親にするものを取得すればできると思います。
(それはそれでうまく行ってないのでもう少し調べますが。)
「野菜カテゴリ」をクリックされたページが第一階層カテゴリのアーカイブページであることを知るにはどうすればいいでしょうか?
今は、野菜なら野菜のカテゴリIDを調べて「category-xx.php」を用意しています。
これを第一階層カテゴリの数だけ用意しているのですが、正直効率悪いなぁと思っていますので、category.php内で切り分けられたらうれしいです。

2.カテゴリに含まれる記事のサムネイル画像を代表して一枚取得する簡単な方法をご存知でしたら教えてください。

ちょっとわかりにくい質問で申し訳ないですが、良い方法を教えてください!

<追記:回答を受けてできたもの>

コード
        <?php
          $cat_id = get_query_var('cat');
          $cat_data = get_term( $cat_id, 'category' );
        ?>
        <?PHP if($cat_data ->parent==0) : //第1階層のとき
          $categories = get_categories('child_of='.$cat_id);  //対象のカテゴリの子カテゴリを取得
          foreach($categories as $category) :     //子カテゴリの数だけ回す
            $cat_url = get_category_link( $category->term_id ); //カテゴリのURL
            $cat_name = $category->cat_name;  //カテゴリ名
            $cat_count = $category->count;  //カテゴリ件数

            //画像付き記事を1個だけ取得する
            $args = array(
             'cat' => $category->cat_ID,
             'posts_per_page' => 1,
             'meta_query' => array(
                array(
                 'key' => '_thumbnail_id',
                 'compare' => 'EXISTS'
                ),
             )
           );
           $query = new WP_Query($args);
           $image_url[0] = get_template_directory_uri().'/img/noimage.jpg';
           if ($query->have_posts()) :
             while ($query->have_posts()) : $query->the_post();
               if (has_post_thumbnail() )  {
                 $image_url = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID), 'large');
               }
             endwhile;
          endif;
          wp_reset_postdata();
       ?>
       <a href="<?php echo $cat_url; ?>"><img src = "<?php echo $image_url[0]; ?>"  alt = "<?php echo $cat_name; ?>"><p><?php echo $cat_name; ?></p></a>
       <p>記事は<?php echo $cat_count; ?>個です</p>
    <?php endforeach; ?>


こんな感じで目的の動作ができました。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

  1. parent が 0 かどうかを確認すれば。

【現在のカテゴリーIDを取得する8種の方法 – WordPress Snippet】
http://tenman.info/labo/snip/archives/7741

【get_term:WordPress私的マニュアル】
http://elearn.jp/wpman/function/get_term.html


  1. WP_Queryでカテゴリとアイキャッチを持っているかを一緒に絞り込めそうです。

【トピック: WP_Queryでアイキャッチ画像ありのみ絞り込み « サポートフォーラム — WordPress】
https://ja.wordpress.org/support/topic/wp_queryでアイキャッチ画像ありのみ絞り込み/

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/19 23:27

    いえ、思い通りになっております。
    混乱させてしまって申し訳ないです(>_<)

    ただ、回答いただいた内容を完全に理解してるわけではないので、せっかくいただいた回答なのに筋違いな解決方法採用していたら申し訳ないし、もったいないなぁ、と思ったもので。

    でも特に指摘がないようですので、大丈夫ですね!
    ありがとうございました。

    キャンセル

  • 2017/02/19 23:40 編集

    あぁ、そういうことですか、意図を汲み取りきれずすみません。ご丁寧にありがとうございます。

    私が回答した部分については書かれているコードの通りです。

    あとは重箱の隅をつつくような部分ですが、get_stylesheet_directory_uri のほうが汎用的かな、とか思います。(親子テーマがない場合はどっちでも良い話です)

    【get_template_directory_uriとget_stylesheet_directory_uriの違い】
    http://www.youngflavor.net/2015/02/2981/

    また、カテゴリ名などは エスケープ しておいてもいいかな、とは思います。ちなみに下記記事にある「esc_url」は、自分でURLを文字列連結した場合などには必須ですが、WordPress関数から出力されるものは必ず通っているので基本しなくても問題ありません。

    【WordPressで使うエスケープの関数について | memocarilog】
    https://memocarilog.info/wordpress/theme-custom/5171

    【【WordPressで文字列を出力する際のエスケープ「esc_html」「esc_attr」の違いについて】 | 今村だけがよくわかるブログ】
    https://www.imamura.biz/blog/6445

    以上、重箱の隅をつついてみました。

    キャンセル

  • 2017/02/20 23:05

    なるほど。勉強になります。

    中身も考えずにget_stylesheet_directory_uriはスタイルシート読むときにしか使わないのかと思ってました(-ω-)
    エスケープ。ふむふむ。
    エスケープ文字自体は知ってるつもりなのですが、どの関数ではエスケープ文字入ってて、どの関数では入ってないのか、等。実はまだわかってないっていうか、現物合わせに走っちゃってました。
    よい機会ですので、今から覚えてしまいます!

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

    キャンセル

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

  • ただいまの回答率 89.97%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる