どもです。
WordPressで企業サイトの製品情報ブログなんかを管理する場合、シングルページに「同じカテゴリの他の記事」へのリンクをつけることがままあると思います。
僕自身、1年くらい前に手がけたサイトでそういうことをやりまして、此度、それを別のサイトに導入したいという流れになりまして。
久しぶりに開いたそのプログラムが、かなりぐちゃぐちゃだったので(当時の苦労が偲ばれる...)、今回の導入にあたって見易く修正してみました。
勿体無いのでついでに公開しときます。
<?php
$postId = $post->ID; //現在の記事のIDを取得する
$switch = 0; //$switchを作成
$termss = ''; //空の$termssを作成
$terms = get_the_terms( get_the_ID(), 'タクソノミ名' ); //投稿が所属するタームを取得
if( !empty($terms) ){ //記事がタームに所属しているとき
if( !is_wp_error( $terms ) ){ //記事のタームがエラーを発していないとき
foreach( $terms as $term ){ //記事が所属するターム(配列)をforeach
if($term->parent == 3){ //$termのIDが「3」のとき(やりたい内容によって変更する箇所)
$termss = $termss ."". $term->slug.","; //$termssにカンマ区切りで$termのスラッグを挿入
}
}
}
}
$termss = substr($termss, 0, -1); //$termssの最後のカンマを取る
$args=array( //query_postsに入れる設定
'tax_query' => array(
array(
'taxonomy' => 'タクソノミ名',
'field' => 'slug', //検索フィールドをスラッグに設定
'terms' => explode(',',$termss) //タームの名称をカンマ区切りで入力
),
),
'post_type' => 'カスタム投稿名',
'posts_per_page'=> -1 //表示件数(-1で全ての記事を表示)
);
query_posts( $args );
if(have_posts()): //記事が存在するのなら
while(have_posts()):the_post(); //記事をforeach
if($post->ID!=$postId){ //現在の記事IDとループの記事IDが等しくないなら
$switch = 1; //スイッチをonに
}
endwhile;
endif;
if($switch==1): //スイッチがonのとき
?>
<ul>
<?php
while(have_posts()):the_post(); //記事をforeach
if($post->ID!=$postId){ //現在の記事IDとループの記事IDが等しくないなら
?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php
}
endwhile;
?>
</ul>
<?php
endif;
wp_reset_query()
?>
記事のループだけで2回も回してしまってますし、まだまだ改善の余地がありそうです。
カスタム投稿に対応させてますので、通常投稿の場合は、
「タクソノミ名」→「category」「カスタム投稿名」→「post」
で大丈夫だったハズです。確認してませんが。