なるほど、複数のカテゴリを持つ記事に対して、同じカテゴリで関連する記事などを表示させたい、とのことですね。
条件とコードを見ていたのですが、厳密には不可能かと思われます。
p1: 記事1, p2: 記事2 , p3: 記事3
としたとき、それぞれのカテゴリが
p1: (a-1, b-2)
p2: (a-1)
p3: (b-2)
となっているとすれば、p1のsingle.phpでp2を取得して表示させたいのにp3が表示されてしまう、ということですね。
これはどこかしらかでカテゴリAを辿って表示させよ、という命令が必要です。
作者側が明示的に特定のカテゴリを埋めてやる必要がある、ということですね。プログラムは自動的にどの親カテゴリを重要視するかわからないので指定が必要、ということです。
コード中にある
$cat = get_the_category(); $cat = $cat[0];
ですが、p1で取得されたカテゴリ一覧から、無作為に0番目のカテゴリを採用しています。ここで恐らく後ろ側のb-2を関連させるカテゴリとして採用してしまっているのですね。
状況によってはa-1が取れるかもしれませんが、a-1が取られるかb-2が取られるかは不明瞭です。
さてここで、カテゴリAを親カテゴリとしてその兄弟カテゴリを基準に他の記事を、ということでしたら可能です。
僕から参考までに、コード例を載せておきます。AのカテゴリIDを事前に調べておき、Aカテゴリにひっかかる子カテゴリを拾っておいてからwp_queryする方法です。
foreach(get_the_category() as $category) {
if ($category->parent == 2) { // 2はAのカテゴリのIDとします
$categories_to_put[] = $category->term_id;
}
}
$wp_query = WP_Query(array('category__in' => $categories_to_put));
このコードは引数チェックなどしていない不完全ですので参考までにどうぞ。
hogetanさま
お忙しいところご回答いただきまして、誠にありがとうございます!
サイトに反映してみた限りでは、問題なく動いているようなのですが、
「引数チェックなどしていない不完全な状態」という点が気になりました。
こちらは追加で引数をチェックするようなコードを入れたほうがよい、ということでしょうか?(何度も申し訳ございません!)
<?php foreach(get_the_category() as $category) {
if ($category->parent == 19) {
$categories_to_put[] = $category->term_id;
}
}?>
<?php query_posts( array('category__in' => $categories_to_put, 'showposts' => 4,'orderby' => 'rand', 'post__not_in' => array($post->ID)) ); ?>
<?php if (have_posts()) : ?>
・・・
早速入れてみられたそうで、そして動いているようでよかったです(^ν^)
引数チェックをしていない件については、「リファレンスを調べたり、実際に動かしたりしていないので、”category__in”などの名前が正確なものか自信がない」との意味でした。
hogetanさま
お世話になります。
ご回答ありがとうございました!
コードチェックの件、了解いたしました。
とても自分では解決できないコードでしたので、大変助かりました!!
最後に1点だけご相談なのですが、このコードを2つ並べて、以下のとおり
親カテゴリが19の記事と、親カテゴリが290の記事を並べてみたのですが、
2つ並べると上の19の記事は機能するのですが、下の290の記事がうまく
取得できていないようなのです。。
こういったコードは1ページに2つあるとうまく動かない、などの制限は
あったりするのでしょうか??
もし何かそういった点があるようでしたら、ご教授いただけますと幸いです
よろしくお願いしますm(._.)m
<?php foreach(get_the_category() as $category) {
if ($category->parent == 19) {
$categories_to_put[] = $category->term_id;
}
}?>
<?php query_posts( array('category__in' => $categories_to_put, 'showposts' => 4,'orderby' => 'rand', 'post__not_in' => array($post->ID)) ); ?>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
// 記事出力(親が19)
<?php endwhile; wp_reset_query();?>
<?php else : ?>
<div class="post">
<div>
<h1>Not Found</h1>
<p>Sorry, but you are looking for something that isn't here.</p>
</div>
</div>
<?php endif; wp_reset_query();?>
<?php foreach(get_the_category() as $cat) {
if ($cat->parent == 290) {
$categories_to_put[] = $cat->term_id;
}
}?>
<?php query_posts( array('category__in' => $categories_to_put, 'showposts' => 4,'orderby' => 'rand', 'post__not_in' => array($post->ID)) ); ?>
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
// 記事出力(親が290)
<?php endwhile; wp_reset_query();?>
<?php else : ?>
<div class="post">
<div>
<h1>Not Found</h1>
<p>Sorry, but you are looking for something that isn't here.</p>
</div>
</div>
<?php endif; wp_reset_query();?>
期待に添えるようなものでよかったです。
手元で試験しているわけではないのでまたもやあれなのですが、中央あたりの
<?php endif; wp_reset_query();?>
この行に、the_post(); を入れてみてはどうでしょうか。
<?php endif; wp_reset_query(); the_post(); ?>
hogetanさま
またまたありがとうございます!
the_post(); をやってみたのですが、どうもうまくいかずで・・・
自分でいろいろやってみた結果、「$categories_to_put」の
変数を上と下で変えてやってみたらうまく行きました!!
なんとか思い通りのものができました。
今回はいろいろ助けていただき、感謝しております!
これで解決済としたいと思います。
また何かありましたら、ご相談にのっていただけますと幸いです。
どうぞよろしくお願い致します。