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プランニング様

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

Leave a Reply

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

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

ページTOPに戻る