scribble warehouse

get_posts()関数を使い、条件に合った記事を表示する


n_20150331_001

このサイトの投稿記事の表示をカスタマイズするため、いろいろ調べたので備忘録として書いておきます。
同じような悩みを抱えている人の参考になれば、と思います。
(wordpressの、少し突っ込んだ内容なので、わかりにくいかもしれません…)

 
今回やりたかったことはこれです。
「個別記事のサイドバーに、同じカテゴリーの記事をランダムに5件表示(今見ている記事は除外)」
これを解決するには、まず記事を呼び出すがあります。

ページ内に(条件付きの)記事を表示したいときには、
・query_posts()
・new WP Query()
・get_posts()
を使う方法があります。記述の仕方とパラメータの設定に多少の差はありますが、目的はほぼ同じです。
(それぞれの違いはまた別の記事で紹介します)
今回はget_posts()関数を使うことにします。

 
実際にコーディングしながら説明するほうがわかりやすいと思うので、早速。

個別記事のサイドバーに、特定のカテゴリーの記事をランダムに5件表示(今見ている記事は除外)

/* 表示されているページが個別記事(single)のときのみにする */
<?php if(is_single()) : ?> // function_1

/* 記事のカテゴリーを取得 */
<?php
$categorize = get_the_category();

/* 複数のカテゴリーに配列で対応する */
$cat_list = Array();
foreach($categorize as $get_cat_list){
array_push($cat_list, $get_cat_list->cat_ID);
};

/* 表示されている記事を除外するため、記事IDを取得 */
$exclude_id = get_the_ID();
?>

/* 上記のデータを使って、条件を指定する */
<?php
$args = array(
'exclude' => $exclude_id, // 除外する記事
'cat' => $cat_list, // このカテゴリーを含む
'numberposts' => 5, // 5件分
'orderby' => rand // ランダムな順序で
);

/* 条件に合う記事を読み込む(get_posts()関数がここで登場!) */
global $post; // グローバル変数で$postを定義(!$postという名前は変更できません!)
$posts = get_posts($args);

/* 投稿情報をそれぞれグローバル変数へセット(テンプレートタグで情報を呼び出せるようになる) */
if($posts): foreach($posts as $post): setup_postdata($post); //function_2
/*
ここに、テンプレートタグやHTMLで記事の表示スタイルを記述します
ex) <a href="<?php the_permalink();?>"><?php the_title();?></a> // タイトルとリンクを表示
*/
?>

<?php endforeach; endif; ?> // function_2のif文とforeach文を閉じる 
<?php wp_reset_postdata(); ?> // $postを元の値に戻す(これは絶対に必要!)
<?php endif; ?> // function_1のif文を閉じる

この処理を使って、サイドバーの一番上にある「同じカテゴリーの記事」を表示しています。
一見難しそうに見えますが、決め打ちした条件であれば、

$args = array(
/* 条件文('パラメータ' => '値')*/
);

global $post;
$posts = get_posts($args);
if($posts): foreach($posts as $post): setup_postdata($post);
/* 表示スタイルの設定 */
<?php endforeach; endif; ?>
<?php wp_reset_postdata(); ?>

これで終わりです。wordpressってホントに便利。
これを覚えると、特定のカテゴリーを除外したり、特定の記事を必ず表示させたりすることも出来るようになります。

また、これを機に、wordpressやphpの知識を深めてみては?


Tagged on: , ,