WordPressとPHP②
親カテゴリの順番に沿って記事を出したい、親カテゴリの順番に沿い、かつ親カテゴリ名も呼び出して記事を並べたい――。
そんなことを考えたことはありませんか?
数ある方法の中から、今回はWordpressのタグとforeachを利用した方法をご紹介します。
上の説明ではちょっとどのような状況なのか想像がつきにくいと思うので、実際に出力されるWebサイトの文例も添えて説明していきます。
最初に完成イメージを明確にしておきましょう。
***************************************************************************
カテゴリID:1の一覧とカテゴリID:2の一覧を順番に出します。
(最初にカテゴリID:1の記事をすべて出す)
※タイトルには記事へのリンクが張られるようにします。
記事番号01タイトル
記事番号02タイトル
記事番号03タイトル
記事番号04タイトル
(次にカテゴリID:2の記事をすべて出す)
※タイトルには記事へのリンクが張られるようにします。
記事番号01タイトル
記事番号02タイトル
記事番号03タイトル
記事番号04タイトル
***************************************************************************
このような記事表示を目指します。
それではスクリプトの全体をご紹介します。
***************************************************************************
<?php
$catParents = array( ①
1,
2
);
foreach($catParents as $catParent): ②
$catParentArray(); ③
$ catParentArray[] = $catParent ④
$args = array(
‘post__in’ => $ catParentArray, ⑤
‘post_type’ => ‘post’,
‘post_status’ => ‘publish’,
‘posts_per_page’ => -1,
);
$the_query = new WP_Query($args);
if($the_query->have_posts()): while($the_query->have_posts()): $the_query->the_post();
?>
<li>
<a href=”<?php the_permalink(); ?>”><?php the_title(); ?></a>
</li>
<?php
endwhile; endif;
endforeach;
?>
***************************************************************************
作業の流れは以下の通りです。
親カテゴリのIDを配列に格納します。
↓
親カテゴリのIDをforeachで順に取り出します。単一の親カテゴリは$catParentになります。
↓
一つの親カテゴリが取り出されるごとに$argsの’post__in ‘に$catParentを代入します。
↓
そしてWP_Queryで$catParentに属する記事情報を取得します。
↓
必要な記事情報(今回はタイトル、パーマリンク)を呼び出します。
↓
次の親カテゴリを取り出す過程に戻ります。すべての親カテゴリが取り出されている場合、処理を終えます。
大事な箇所を、スクリプトにある番号順に見ていきましょう。
- $catParents
この変数に親カテゴリのカテゴリIDを格納します。
- foreach($catParents as $catParent):
親カテゴリのIDを順番に取り出します。
ここでは1、2の順ですね。逆にしたいときは①で配列の設定を$catParents = array(2,1);にしましょう。このように配列の設定を変えることで親カテゴリの出力順を自在に変えることができます。
- $catParentArray();
後ほど$catParentを配列として使用するため、その下準備をします。
配列の初期設定をします。
またこの配列は②のforeachの中で使い切ってしまいますので、foreachの中に置きましょう。
- $ catParentArray[] = $catParent
$catParentを配列に格納します。
- ‘post__in => $ catParentArray,
クエリ形式文字列$argsに取得したいカテゴリIDを配列で設定します。 ここで③④で設定した配列「$catParentArray()」を使用します。
そしてWP_Queryで記事情報を取得します。本例ではパーマリンク、タイトルを呼び出しています。
カテゴリID1の記事のループが終わると、次に②のforeachでカテゴリID2の記事の呼び出しに入ります。カテゴリID2の記事についても②~⑤の処理を繰り返します。
$argsからWP_Query、ループまでをすっぽりforeachで挟む、少し珍しい形式をご紹介しました。
親カテゴリ毎に分けて記事を出すときには便利なこのforeachの使い方。get_the_categoryなどで親カテゴリの名前を取得して表示させるなど、工夫次第でもっと良い記事内容になりますね。
ただ、カテゴリ情報表示に関していうならば、これとよく似た記事の表示ができるwp_list_categories()というタグがありますよね。こちらでできる条件であれば、こちらで処理してしまったほうがスクリプト的には短くて見やすいのではないかな、と思います。
さて、では上述のようなforeachの使い方が生きる時とはどんな時でしょうか。
それは階層をもつ固定ページの表示時です。
親ページの順に子ページの一覧を作りたいときなどに生きてきます。
完成イメージは以下のようになります。
***************************************************************************
(親ページID:1の記事をすべて出す)
※タイトルには記事へのリンクが張られるようにします。
子ページ01タイトル
子ページ02タイトル
子ページ03タイトル
子ページ04タイトル
(親ページID:2の記事をすべて出す)
※タイトルには記事へのリンクが張られるようにします。
子ページ01タイトル
子ページ02タイトル
子ページ03タイトル
子ページ04タイトル
***************************************************************************
カテゴリの例と似ていますね。
スクリプトを見てみましょう。
***************************************************************************
<?php
$pageParents = array( ①
1,
2
);
foreach($pageParents as $pageParent): ②
$args = array(
‘post_parent’ => $pageParent, ③
‘post_type’ => ‘post’,
‘post_status’ => ‘publish’,
‘posts_per_page’ => -1,
);
$the_query = new WP_Query($args);
if($the_query->have_posts()): while($the_query->have_posts()): $the_query->the_post();
?>
<li>
<a href=”<?php the_permalink(); ?>”><?php the_title(); ?></a>
</li>
<?php
endwhile; endif;
endforeach;
?>
***************************************************************************
作業の流れは以下の通りです。
親ページのIDを配列に格納します。
↓
親カテゴリのIDをforeachで順に取り出します。
↓
一つの親カテゴリが取り出されるごとに$argsの’post_paren ‘に$ pageParentを代入します。
↓
そしてWP_Queryで$ pageParentに属する記事情報を取得します。
↓
必要な記事情報を呼び出します。
↓
次の親カテゴリを取り出す過程に戻ります。
このスクリプトのポイントを、スクリプトにある番号順に見ていきましょう。
- $pageParents = array(
ここで親ページのIDを配列に格納します。
- foreach($pageParents as $pageParent):
次に親ページのIDをforeachで順番に取り出します。
このとき$pageParentは整数値です。
- ‘post_parent’ => $pageParent,
$argsに引数「’post_parent’ => $pageParent,」を渡します。
‘post_parent’は値として指定した親ページの子ページを返します。値は整数値を使用します。
カテゴリの例と違い、②で得る$pageParentを配列に入れない理由がこれです。
あとはカテゴリの例と同じです。WP_Queryで記事情報を取得し、取得したデータを呼び出します。親ページID1の記事のループが終わると、次に②のforeachで親ページID2の記事の呼び出しに入ります。親ページID2の記事についても②~③の処理を行います。
普段$argsとWP_Queryを丸ごとforeachで囲むということはあまりしないのではないかと思います。筆者自身も最初にこのようなスクリプトを見た時には「これ使い勝手いいのか?」と疑問に思いました。
しかし、実際に使ってみると非常に便利です。
柔軟な思考をもって、WordpressとPHPを使いこなしたいものです。
【もっと知識を深めるには】
foreachについてはこちらをご参照ください。
http://php.net/manual/ja/control-structures.foreach.php
配列につていはこちらに詳しい記述があります。
http://php.net/manual/ja/language.types.array.php
クエリ形式文字列に関して(WP_Query)はこちら
- 2398 views
- キム