カテゴリーは、親子関係にある場合にのみ「複数のチェック可」という前提です。
■
■
■
□
□
□
はいいけれども、
■
■
■
■
□
□
はダメです。
■ functions.php
<?php
function pinpon($the_cats,$cat_obj) {
$rtn = false;
$n = count($the_cats);
if ($n==1) {
$rtn = true;
} else {
if ($cat_obj->category_parent!=0) {
$rtn = true;
for ($i = 0; $i <$n ; $i++) {
if ($cat_obj->cat_ID!=$the_cats[$i]->cat_ID) {
if (!(cat_is_ancestor_of($the_cats[$i]->cat_ID,$cat_obj->cat_ID))) {
$rtn = false;
break;
}
}
}
} else {
$rtn = false;
}
}
return $rtn;
}
function disp_child($catid) {
if ($catid==0) {
$categories = get_categories('parent=0&orderby=name&order=DESC');
} else {
$categories = get_categories('orderby=name&order=DESC&child_of='.$catid);
}
if (!(empty($categories))) {
foreach($categories as $category) :
?>
<h3><?php echo esc_html($category->cat_name); ?></h3>
<ul>
<?php
query_posts('posts_per_page=-1&cat='.$category->cat_ID);
if (have_posts()) : while (have_posts()) : the_post();
$cat_array = get_the_category();
if (pinpon($cat_array,$category)) :
?>
<li><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></li>
<?php endif; ?>
<?php endwhile; endif; ?>
<?php disp_child($category->cat_ID);?>
</ul>
<?php
endforeach;
}
}
?>
■ フロントページ
<?php if(is_home() && !is_paged()): ?>
<?php
disp_child(0);
wp_reset_query();
?>
<?php endif; ?>
カテゴリーのネストが深かったり、記事が多い場合は遅いかもしれません。また、真剣にテストはしていないので、どこかにシクジリがあるかもしれません。
ありがとうございます。お返事が遅くなってすみません。
提示いただいたコードで確認しましたところ、ほぼ近い形になりました。
[親カテゴリー1]
・記事1
・記事2
・記事3
[子カテゴリー1]
・記事1
・記事2
[親カテゴリー2]
・記事4
となりました。
子カテゴリーにある記事が親カテゴリーにもリストアップされます。
[親カテゴリー1]
・記事3
[子カテゴリー1]
・記事1
・記事2
[親カテゴリー2]
・記事4
としたいのですが、その場合はどのようにするのでしょうか?
カテゴリーは、親子関係にある場合にのみ「複数のチェック可」という前提です。
すみません、この意味はどのようなことでしょう?
よろしくお願いします。
まずは、修正から、
1) function disp_child($catid) { の上の方のelse節で、hierarchical=0 を追加してください。
2) query_posts() はえらく遅いので、get_posts() に変更してください。
function disp_child($catid) {
if ($catid==0) {
$categories = get_categories('parent=0&orderby=name&order=DESC');
} else {
$categories = get_categories('hierarchical=0&orderby=name&order=DESC&child_of='.$catid);
}
if (!(empty($categories))) {
foreach($categories as $category) :
?>
<h3><?php echo esc_html($category->cat_name); ?></h3>
<ul>
<?php
$myposts = get_posts('numberposts=-1&orderby=menu_order&order=ASC&cat='.$category->cat_ID);
foreach ($myposts as $p) {
$cat_array = get_the_category($p->ID);
if (pinpon($cat_array,$category)) {
?>
<li><a href="<?php echo esc_url($p->guid); ?>"><?php echo esc_html($p->post_title); ?></a></li>
<?php
}
}
disp_child($category->cat_ID);
?>
</ul>
<?php
}
}
}
?>
■ フロントページ
<?php if(is_home() && !is_paged()): ?>
<?php
disp_child(0);
// 不要 wp_reset_query();
?>
<?php endif; ?>
カテゴリーは、親子関係にある場合にのみ「複数のチェック可」という前提です。
↓
直径の親子関係以外のものが含まれる場合は×。
[すべて直径の親子関係の範囲内はOK]
親子孫
■
■
■
□
□
—- or ——-
親子孫
□
□
□
■
■
—- or ——-
親子孫
■
□
■
□
□
[直径以外が含まれる場合はNG]
親子孫
■
□
□
■
□
—- or ——-
親子孫
■
□
■
■
□
□
—- or ——-
□
□
■
□
■
□
<例>
■記事にチェックしても良い組み合わせ
[親カテゴリー1]
[子カテゴリー1]
[子カテゴリー2]
[親カテゴリー1,子カテゴリー1]
[親カテゴリー1,子カテゴリー2]
[親カテゴリー2]
[子カテゴリー3]
[親カテゴリー2,子カテゴリー3]
etc
■記事にチェックしてはいけない組み合わせ
[親カテゴリー1,親カテゴリー2]
親カテゴリー1,親カテゴリー2 が親子関係ではない。
[親カテゴリー1,子カテゴリー1,親カテゴリー2]
親カテゴリー1,親カテゴリー2 が親子関係ではない。
[親カテゴリー1,子カテゴリー1,子カテゴリー2]
子カテゴリー1,子カテゴリー2 が親子関係ではない。
[親カテゴリー1,親カテゴリー2,子カテゴリー3]
親カテゴリー1,親カテゴリー2 が親子関係ではない。
[親カテゴリー2,子カテゴリー1]
親カテゴリー2,子カテゴリー1 が親子関係ではない。
etc
>子カテゴリーにある記事が親カテゴリーにもリストアップされます。
あら?
[親カテゴリー1]
・記事3
となるように、pinpon() ではじいているはずなのですが??
再び修正
function pinpon($the_cats,$cat_obj) {
$n = count($the_cats);
if ($n==1) {
if ($cat_obj->cat_ID==$the_cats[0]->cat_ID) {
$rtn = true;
} else {
$rtn = false;
}
} else {
if ($cat_obj->category_parent!=0) {
$rtn = true;
for ($i = 0; $i <$n ; $i++) {
if ($cat_obj->cat_ID!=$the_cats[$i]->cat_ID) {
if (!(cat_is_ancestor_of($the_cats[$i]->cat_ID,$cat_obj->cat_ID))) {
$rtn = false;
break;
}
}
}
} else {
$rtn = false;
}
}
return $rtn;
}
$myposts = get_posts('numberposts=-1&orderby=menu_order&order=ASC&cat='.$category->cat_ID);
▽
$myposts = get_posts('numberposts=-1&order=ASC&cat='.$category->cat_ID);
(&orderby=menu_order を取る)
—————————————–
記事1 親カテゴリー1
記事2 親カテゴリー1
記事3 親カテゴリー1,子カテゴリー1
記事4 親カテゴリー1,子カテゴリー2
記事5 子カテゴリー2(親カテゴリー1なし)
記事6 親カテゴリー2
記事7 親カテゴリー2,子カテゴリー3
—————————————–
とすると、以下のようになるはずです。
http://powercms.sitemix.jp/
カテゴリーや記事の順番指定は適当に変更してください。
もしかして、私が勘違いしていたのかもしれません。カテゴリーが必ず一つというのなら
—————————————–
記事1 親カテゴリー1
記事2 親カテゴリー1
記事3 子カテゴリー1
記事4 子カテゴリー2
記事5 子カテゴリー2
記事6 親カテゴリー2
記事7 子カテゴリー3
—————————————–
無条件に正しく表示することが出来ます。ただし、こうするとパンクズナビがネストして表示できないような気がします。
ありがとうございます!!
出来ました!
サンプルサイトまで作っていただいてありがとうございます。
親子カテゴリーの関係、理解しました。
提示いただいたコードを理解するよう精進します!
ありがとうございました!
すみません、解決したと思ったのですが、一つ問題がでました。
カテゴリータイトルにリンクをつける場合はどのようにするのでしょうか?
<h3><a href="<?php echo esc_url($category->catid); ?>"><?php //echo esc_html($category->cat_name); ?></a></h3>
等としてみましたが、思う結果が得られませんでした。
よろしくお願いします。
カテゴリーのリンク
<h3><a href="<?php echo get_category_link($category->cat_ID); ?>"><?php echo esc_html($category->cat_name); ?></a></h3>
投稿へのリンクも関数を使った方がいいかもしれません
<li><a href="<?php echo esc_url($p->guid); ?>"><?php echo esc_html($p->post_title); ?></a></li>
▽
<li><a href="<?php echo get_permalink($p->ID); ?>"><?php echo esc_html($p->post_title); ?></a></li>
回答ありがとうございます。
ああ、そっかぁ!という感じで、自身ちょっとパニクっていました。