WordPressに関する情報や技術紹介です

親カテゴリに属するサブカテゴリのIDを取得する関数

以前、サブカテゴリ毎に記事をまとめて表示2という記事を書きましたが、少し需要があるようなのでもう少しスマート(だと思える)取得をしてみます。

といっても「怪しい正規表現」から「データベースで直接取得」に変わっただけですけど。

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

下記の関数をfunctions.php辺りに入れておけばいつでも使えます。

// サブカテゴリIDを取得する関数
function get_subcat_id( $cat_id = null ) {
	global $wpdb;

	if($cat_id == null) return false;

	// サブカテゴリを取得
	$sub_cat = $wpdb->get_col($wpdb->prepare("SELECT term_id FROM $wpdb->term_taxonomy WHERE parent=%d", $cat_id));
	return $sub_cat;
}
WordPress サブカテゴリのIDを取得する関数

取得できるのは直下のサブカテゴリのみです。
使用方法としては、以下のように使えます。

<?php
// サブカテゴリのIDを取得(親カテゴリのIDを5とする)
$sub_cat = get_subcat_id(5);

// サブカテゴリが存在するか
if($sub_cat) {

// ループして処理
foreach($sub_cat as $id) :
?>

<h3><a href="<?php echo get_category_link($id); ?>"><?php echo get_cat_name($id); ?></a></h3>
<ul>
<?php if (have_posts()) : query_posts("posts_per_page=5&cat=$id&orderby=ID&order=desc");  ?>
<?php while (have_posts()) : the_post(); ?>
	<li><?php the_time('y-m-d'); ?> <a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
<?php endwhile; endif; wp_reset_query(); ?>
</ul>

<?php
endforeach;

} else {
	echo '<p>サブカテゴリは存在しません。</p>';
}
?>
WordPress サブカテゴリのIDを取得する関数

間違いがあればご指摘下さい。

タグ
, ,
トラックバックURL
  • matsu さん:
    2012/1/24 火曜日 21:15:48

    コチラの記事、大変参考になりました。
    WordPress初心者なんですが、やりたいこととほぼ同様の答えがこちらでした。

    1点質問なのですが、こちらをそのまま使うと、記事の登録されていないサブカテゴリ(部分)も表示されてしまいます。
    この問題を解決する方法を教えて頂けないでしょうか。

    お忙しいところ恐れ入りますが、
    何卒よろしくお願いいたします。

  • ISプランニング さん:
    2012/1/25 水曜日 08:44:05

    >matsuさん
    参考になり何よりです。

    > 1点質問なのですが、こちらをそのまま使うと、記事の登録されていないサブカテゴリ(部分)も表示されてしまいます。
    > この問題を解決する方法を教えて頂けないでしょうか。

    サブカテゴリーのIDを取得する時に調べるSQLもあると思いますが、簡単なのは以下のやり方だと思います。

    1.12,13行目の<h3>と<ul>タグを15行目の下に入れる。

    2.18行目の</ul>タグを17行目の前に入れる。

    have_posts()は「記事がある場合」ですから、記事が無い場合は出力しないはずです、多分。試していないのですが、恐らく問題ないはずです。

    以上、参考までに。(^^)

  • matsu さん:
    2012/1/25 水曜日 12:24:25

    ISプランニングさま
    ご回答誠にありがとうございます!

    実はその形は試していました。
    確かにそうすると、記事0件のは表示されなくなるのですが、
    そうすると各エントリーに対してとが出力されてしまうという別の問題が・・・。

    やりたいのがエントリーの一覧に対してサブカテゴリーが1つの形なので
    もし何かうまくいく方法があればご教授お願い申し上げますm( _ _ )m

  • matsu さん:
    2012/1/25 水曜日 12:41:36

    ISプランニングさま
    すいません、文字が抜けてしまっておりました。

    そうすると各エントリーに対してとが出力されてしまうという別の問題が・・・。

    と書くつもりでした。

  • ISプランニング さん:
    2012/1/25 水曜日 12:52:35

    >matsuさん
    多分タグを書こうとしているのでは?
    タグは消されるので「&lt;」と「&gt;」(どちらも半角で)を使ってください。

  • matsu さん:
    2012/1/25 水曜日 13:04:12

    すいません!

    そうすると各エントリーに対して<h3>と<ul>が出力されてしまうという別の問題が・・・。

    です!

  • ISプランニング さん:
    2012/1/25 水曜日 13:04:34

    >matsuさん
    あぁ意味が分かりました。(^_^;)
    確かにこれはダメですね。すいません。

    では、14行目と15行目の間に、

    <?php if (have_posts()) : ?>

    を入れて、17行目を

    <?php endwhile; endif; endif; wp_reset_query(); ?>

    と変えたらどうでしょうか?
    (というか14行目の「if (have_posts()) :」は不要の予感…)

  • ISプランニング さん:
    2012/1/25 水曜日 13:15:01

    ごめんなさい、もう少しちゃんと書きます。

    foreach($sub_cat as $id) : 以降からです。

    <?php query_posts(省略); ?>
    <?php if(have_posts()) : ?>
    <h3>省略</h3>
    <ul>
    <?php while (have_posts()) : the_post(); ?>
    <li>省略</li>
    <?php endwhile; ?>
    </ul>
    <?php endif; wp_reset_query(); ?>

    どうでしょうか?

  • matsu さん:
    2012/1/25 水曜日 13:34:06

    ISプランニング様

    ありがとうございます!!!
    完璧にできました!!!
    本当にありがとうございました!!!

  • aure さん:
    2013/3/9 土曜日 11:37:34

    ISプランニング様

    ありがとうございます!
    こんな素晴らしい記事を残してくださったおかげで、
    Wordpress超ド級初心者の私がクライアントの要望にどうにかこうにかお応えできました!

    しかしここで図々しくももう一つ、お尋ねなのですが…
    サブカテゴリごとに表示される記事件数が、最大5件ですよね。
    これは、14行目の

    posts_per_page=5

    かな、と初心者ながらに思ったので、調べつつpage=5の値を=-1に変えたのですが、
    表示される件数は変わらず。無理くり100とかにも変えてみたのですが(笑)、
    でもうまくいきません。

    もしかしたら、分かって当然なことを改めて聞いているのかもしれず大変恐縮なのですが、
    ご教授くださいますと幸いです。
    どうぞよろしくお願いいたします。

  • aure さん:
    2013/3/9 土曜日 14:00:40

    自己解決しました!
    お忙しいところ、スミマセン(>_<;

  • saka さん:
    2013/5/15 水曜日 02:05:23

    こちらのソースを参考にして、
    なんとかサブカテゴリを利用したページを作成することができました。
    WPへに乗り換えてやっているのですが、
    PHPにあまり詳しくありません。

    サブカテゴリのスラッグか、
    登録日でソートする事は可能でしょうか。
    自分でも調べようとは思っていますが、
    いかんせん初心者なので、教えていただければ幸いです。

  • ISプランニング さん:
    2013/5/15 水曜日 08:42:15

    > sakaさん
    ご参考いただきありがとうございます。

    > サブカテゴリのスラッグか、
    > 登録日でソートする事は可能でしょうか。

    少し意味が分かりにくいのですが、記事を並び替える場合は、query_postsのwikiを参考にすれば良いと思います。

  • saka さん:
    2013/5/16 木曜日 01:09:45

    ISプランニング様

    早速のご回答ありがとうございます!
    記事の並び替えはできるのですが。。。

    <?php
    $sub_cat = get_subcat_id(11);

    if($sub_cat) {
    foreach($sub_cat as $id) :
    ?>

    <h2><?php echo get_cat_name($id); ?></h2>
    <?php if (have_posts()) : query_posts(“posts_per_page=10&cat=$id&orderby=date&order=DESC”); ?>
    <?php while (have_posts()) : the_post(); ?>
    <div class=”title01″><?php the_title(); ?></div>
    <div class=”accordion”>
    <table border=”0″ cellpadding=”0″ cellspacing=”0″>
    <tr>
    <th>時間</th>
    <td><?php the_field(‘live_time’,$post->ID); ?></td>
    </tr>
    <tr>
    <th>場所</th>
    <td><a href=”<?php the_field(‘live_place_url’,$post->ID); ?>” target=”_blank”><?php the_field(‘live_place’,$post->ID); ?></a></td>
    </tr>
    </table>
    </div>
    <?php endwhile; endif; wp_reset_query(); ?>

    <?php
    endforeach;

    } else {
    echo ‘<p>サブ情報は存在しません。</p>’;
    }
    ?>

    このソースだと、記事の繰り返しのソートはできたのですが、
    サブカテゴリに対してのソートができないのです。
    これも、query_postsを利用してできるのか試行錯誤したのですが、
    そもそも、違うのではないかとも思ったりで・・・
    わかりにくくて申し訳ございませんが、
    ご回答いただければ幸いです。

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

  • ISプランニング さん:
    2013/5/16 木曜日 08:55:39

    > saka さん
    なるほど。サブカテゴリを並び替えたいのですね?

    であれば、ここで書いてある「get_subcat_id」という関数で書かれているクエリ(データベースへの問い合わせ文)を変更すれば大丈夫です。


    $sub_cat = $wpdb->get_col($wpdb->prepare("SELECT term_id FROM $wpdb->term_taxonomy WHERE parent=%d", $cat_id));

    上記の「SELECT」以降の文がサブカテゴリを取得する為のクエリですので、これを改造すれば良いかと。

    抜粋すると、

    SELECT term_id FROM $wpdb->term_taxonomy WHERE parent=%d ORDER BY term_id

    という感じで「ORDER BY ~」を追加します。

    ただ、WordPressのテーブル構造を見る限り、日付のデータは無いようなので、term_idなどの登録順で並び替えるぐらいしかできないと思います。

  • saka さん:
    2013/5/17 金曜日 01:21:05

    ISプランニング様

    ありがとうございました!
    無事表示されました〜
    いいお勉強になりました!!

  • 0708 さん:
    2014/2/24 月曜日 10:08:47

    ISプランニング様 ぐぐってこの記事にたとどりつきました。

    自分のやりたいことがとても近いんですが、
    このやりた方だと、親カテゴリに属してるの子カテゴリの記事が全部でてきちゃいます。

    親カテゴリに属している特定の子カテゴリ(現ページの子カテゴリ)だけの記事を表示したいです。

    表現がわかりずらいと思いますが、アドバイスよろしくお願いします。

  • ISプランニング さん:
    2014/2/25 火曜日 08:49:12

    > 0708さん
    ご参考いただきありがとうございます。

    > 親カテゴリに属している特定の子カテゴリ(現ページの子カテゴリ)だけの記事を表示したいです。

    だとすれば子カテゴリーを取得後のループで回す際にif文で分岐させれば良いのではないでしょうか?


    foreach($sub_cat as $id) :
    if($id === 特定の子カテゴリID) {
    // 処理
    }
    endforeach;

    みたいな感じです。

  • 0708 さん:
    2014/2/28 金曜日 00:58:38

    迅速な返答ありがとうございます。
    指定した小カテゴリを取得ではなく、

    現在、親カテゴリが複数あります。子カテゴリも複数あります。
    親カテゴリを指定して、現ページの子カテゴリをうまく取得して、
    single.phpに子カテゴリ別の新着情報を載せたいと思っています。

    現状、指定した親の子カテゴリの記事が全て表示されてしまいます。

    とても悩んでいます。よろしくお願いします。

  • ISプランニング さん:
    2014/2/28 金曜日 08:45:41

    >0708さん
    当サイト内の最新記事の取得を参考にしてください。

    また、これ以上のコーディングに関する質問は「ボランティア」の範疇を出てしまいますので、申し訳ありませんが後はご自身で考えてください(自分で考えて解決する事も大切ですよ)。

Leave a Reply

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

ページTOPに戻る