WordPress備忘録

デザイン

デザインに関する備忘録

記事表示ここから

サブカテゴリ毎に記事をまとめて表示2

前回の記事で不満だった部分を解消してみた。
具体的には以下のようにする

  1. 親カテゴリのトップページにサブカテゴリの一覧を表示
  2. 各サブカテゴリ毎に記事をまとめて表示

前回で解決できなかった問題は自動でサブカテゴリの一覧を取得してループさせながら各HTMLを出力させる事。
そもそもつまづきの原因はサブカテゴリのIDを取得できなかったから。
逆に言うと「親カテゴリに属するサブカテゴリのIDを全て取得」できれば実現可能という事になる。
そこでかなり微妙ながらサブカテゴリのIDを取得するように試みた。

まずはサブカテゴリを取得する

wp_list_categories('引数')

カテゴリ一覧を取得できる。引数に親カテゴリのIDを指定すればサブカテゴリの一覧が取得できる。

echo
すぐに出力するかPHPのデータとして利用するか
title_li
タイトル
style
リスト形式で出力するか<br>で出力するか
child_of
親カテゴリのIDを指定

他に必要であれば足す。ここで変更するのはchild_ofだけで、他は全て下と同じで構わない。

PHP:
  1. /*
  2. これで$subCategoriesにサブカテゴリが配列として収められる。
  3. $subCategories[0] = <a href="サブカテゴリのURL">サブカテゴリ名</a>
  4. */
  5. $subCategories = explode('<br />', wp_list_categories('echo=0&title_li=&style=none&child_of=3'));

次にサブカテゴリの名前だけを取得してそこからIDを取得する。
下はサブカテゴリ名からIDを取得する関数。

get_cat_ID('カテゴリ名')

引数にカテゴリ名を指定するとIDが取得できる。

上記関数でIDが取得できるのが分かったので、先の$subCategories 配列からサブカテゴリ名だけを抽出してIDを取得すれば良いかと。
そこで何となく怪しい正規表現を駆使して$catList配列からサブカテゴリ名を抽出していき、IDを取得していく。

PHP:
  1. //IDを入れる配列を宣言
  2. $catIDs = array();
  3. //リンク付サブカテゴリを入れる配列を宣言
  4. $catList = array();
  5.  
  6. //正規表現を作成
  7. $reg = '/<a.*?>(.*)?<.*/si';
  8.  
  9. foreach($subCategories as $cat) {
  10.     if(preg_match($reg, $cat, $value)) {
  11.         //カテゴリ名からIDを取得して配列に追加
  12.         array_push($catIDs, get_cat_ID($value[1]));
  13.         array_push($catList, $cat);
  14.     }
  15. }

本当にこんな正規表現で大丈夫かしら?と不安一杯だが、少なくとも私の環境では大丈夫なので良しとする。
これで、
【 $catList 】にリンク付きのサブカテゴリ一覧
【 $catIDs 】にサブカテゴリのID一覧
が取得できる。

IDまで取得できれば後はループで回していけばOKではないかと。
以下が一連のコード。

PHP:
  1. <?php
  2. //親カテゴリに属するサブカテゴリを配列で取得
  3. $subCategories = explode('<br />', wp_list_categories('echo=0&title_li=&style=none&child_of=3'));
  4.  
  5. $catIDs = array();
  6. $catList = array();
  7.  
  8. //正規表現を作成
  9. $reg = '/<a.*?>(.*)?<.*/si';
  10.  
  11. /*
  12. サブカテゴリ名だけを取得後、
  13. サブカテゴリに対応するIDを取得して配列に追加
  14. */
  15. foreach($subCategories as $cat) {
  16.     if(preg_match($reg, $cat, $value)) {
  17.         //カテゴリ名からIDを取得して配列に追加
  18.         array_push($catIDs, get_cat_ID($value[1]));
  19.         array_push($catList, $cat);
  20.     }
  21. }
  22.  
  23. //ループしてHTMLを作成
  24. for($i=0; $i<count($catIDs); $i++) {
  25. ?>
  26.  
  27. <h3 class="title"><?php echo $catList[$i]; ?></h3>
  28. <ul class="ul-content-list">
  29. <?php if (have_posts()) :  query_posts('posts_per_page=5&cat=' . $catIDs[$i] . '&orderby=ID&order=desc')?>
  30. <?php while (have_posts()) : the_post(); ?>
  31.     <li><?php the_time('y-m-d'); ?>&nbsp;&nbsp;<a href="<?php the_permalink() ?>" class="bluelink"><?php the_title(); ?></a></li>
  32. <?php endwhile; endif; ?>
  33. </ul>
  34.  
  35. <?php } ?>

もうちょっとまともなやり方があれば、誰か教えてください。

記事表示ここまで
リンクここまで

この記事のコメント・トラックバックRSS

コメント

  • BBking さんより:
    2010-06-15 14:09:54

    はじめまして。
    何気にググってこちらにたどり着きました。

    WPでこんな事ができないかなぁ・・なんて思っていたところ、
    まさにストライクな記事に出会えて感激です!

    そこで一つご質問なのですが、
    以下のページですと各カテゴリリストの右下に、
    more...で該当カテゴリへのリンクが追加されています。

    http://www.is-p.cc/wordpress

    この場合、リンケージのURLはどのように取得すればよろしいのでしょうか?
    構想としては、カスタムフィールドで指定したサムネイルを表示させて、
    そこに同様のリンクを貼りたいと思っています。

    大変お忙しいとは思いますが、ご教授いただけましたら幸いに存じます。
    何卒、よろしくお願い致します。

  • ISプランニング さんより:
    2010-06-15 14:55:49

    >BBking さん
    コメントありがとうございます。

    ストライクですか?良かったです。
    なにぶん正規表現が怪しいので、あんまりお勧めはしませんが…。

    ご質問の件ですが、リンケージの意味が私はよく分かっておりませんが(お恥ずかしい!)、単純にリンクのURLという事でしたら、WP関数の get_category_link() を使っているだけだと思います。

    もし意味が違ってたらすいません。もう少し詳しく説明していただけたらお答えできると思います。

  • BBking さんより:
    2010-06-15 15:58:56

    早々にレスを頂きましてありがとうございます。
    こちらの説明が分かりずらくてすいません。

    例えば、サンプルのソースでは、
    以下の部分で各子カテゴリのタイトル取得とリンクを同時に設定しています。



    それで実際の出力は以下になります(他の子カテゴリも同様)。

    <a href="http://www.is-p.cc/category/wordpress/install" rel="nofollow">インストール</a>

    当方がしたいのは子カテゴリのタイトルとは別に、
    任意のテキストや画像に対してもリンクを設定したいのです。

    more...を例にすると以下のURLの取得方法が分からないということになります。

    <a href="○○○○" rel="nofollow">more...</a>

    これでご質問の意味が伝わりますでしょうか?
    お手数をお掛けします。

  • ISプランニング さんより:
    2010-06-15 16:20:50

    >BBkingさん
    ムムム…?
    (^-^; ますます分からなくなりました。
    先程の回答は回答になっていなかったでしょうか?

    具体的に言うと、for文のループ中で $catIDs[$i] という箇所がサブカテゴリのIDになります。

    なので、

    <a href="<?php echo get_category_link($catIDs[$i]); ?>">何かしらの画像とか</a>

    という書き方をすればサブカテゴリのカテゴリページのURLにリンクします。

    もしかしてBBkingさんの仰るリンク先というのは全然別のリンクを指すのでしょうか?
    もしそうならちょっと私の理解している事と全然違うので答えようがないのですが…。

  • BBking さんより:
    2010-06-15 16:49:29

    まさにこれです!!
    的を得た説明が出来ずに大変お手数をお掛けしました。

    WordPressをCMS化して企業サイトを構築する場合、
    サブカテゴリ一覧⇒サブカテゴリ⇒詳細ページという遷移はある意味必須だと思うのですが、
    なかなか分かりやすい情報が見つからず悶々としておりました。

    これで一歩前進出来そうです。
    お忙しい中、本当にありがとうございました!!

  • ISプランニング さんより:
    2010-06-15 17:26:59

    >BBking さん

    そうですか、良かったです。

    ちなみにこのやり方だと何かしら問題が出てくる可能性もありますので、ちょっと先程データベースから直接サブカテゴリIDを取得する関数を作成してみましたので時間があればそちらを試してみてください。

    サブカテゴリIDを取得する関数

トラックバック

  • サブカテゴリ別に一覧表示する

    カテゴリ別に一覧表示したかったんだけど、どうしたらいいんだ。。ていうのを半月くらい前からどうしようーと思っていた。けど、他の業務も一杯でさっぱり手が付けられない。。

    ...

    投稿日時: 2009-02-26 16:49:13 投稿者: そうだ。ブログを書こう!
コメント・トラックバック ここまで

トラックバック用URL:

コメントフォーム

コメント入力

コメントフォーム
※管理人にのみ公開されます

記事のリンク先URL:http://www.is-p.cc/wordpress/design/get_cat_id/138

空白
ページのトップに戻る
空白