WordPress

カスタム投稿タイプをカスタムフィールドの値で並び替えさせるサブループの作り方

カスタム投稿タイプをカスタムフィールドの値で並び替えさせるサブループ

とあるクライアントさんからカスタム投稿タイプを特殊な順番で並び替えたいと言われました。そこで、カスタムフィールドに値を入れてそれを並び替えの基準にしようというのが今回の趣旨です。

下記がそのときに作ったコードです。

PHP

<?php
$custom_posts = get_posts(array(
    'post_type' => 'カスタム投稿タイプスラッグ', // 投稿タイプ
    'posts_per_page' => 6, // 表示件数
    'meta_key' => 'カスタムフィールドのキー', //並び替えに利用したいカスタムフィールドのキーを指定
    'orderby' => 'meta_value', //カスタムフィールドの値で並び替え
    'order' => 'ASC' // 昇順・降順
    )
));
global $post;
if($custom_posts): foreach($custom_posts as $post): setup_postdata($post); ?>
   
<!-- ループはじめ -->
<h3><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h3>
<p><?php the_time('Y/m/d') ?></p>
<p><?php the_excerpt(); ?></p>
<!-- ループおわり -->
   
<?php endforeach; wp_reset_postdata(); endif; ?>

具体的なループの吐き出しの部分は各々で作ってくださいね。

コードの解説

コードの解説です。下記のコードの行をクリックするとその行の説明が開きますので、お好きな行をクリックしてみてください。

<?php
$custom_posts = get_posts(array(
get_posts()は、投稿の一覧を表示させるときに使うお決まりの関数で、取得したい記事の設定を行います。全体の骨組みは下記のようになります。

PHP

<?php
$custom_posts = get_posts(array(
    // 取得する投稿の設定
));
global $post;
if($custom_posts): foreach($custom_posts as $post): setup_postdata($post);
?>
    // ループで設定した投稿データを出力
<?php endforeach; endif; wp_reset_postdata(); ?>

「取得する投稿の設定」のところで取得したい投稿の設定を行い、それを「ループで設定した投稿データを出力」のところで出力します。上記の骨組みは公式のようなものなので覚えてしまっても良いかもしれません。

ここでは、取得したい記事の設定を変数$custom_postsに代入しています。

    ‘post_type’ => ‘カスタム投稿タイプスラッグ’, // 投稿タイプ
投稿タイプの指定を行っています。ここにカスタム投稿タイプのスラッグを入れます。
    ‘posts_per_page’ => 6, // 表示件数
'posts_per_page' => 6,は記事の表示件数の指定です。数字を指定する場合は、値のところにクオーテーションマーク「’」をつけて「’6’」とする必要はありません。
ちなみに、記事を全件表示したいときは「-1」と指定します。
    ‘meta_key’ => ‘カスタムフィールドのキー’, //並び替えに利用したいカスタムフィールドのキーを指定
カスタムフィールドのキーを指定しています。
これをこの後、記事の並べ替えの基準に指定します。
    ‘orderby’ => ‘meta_value’, // 表示順の基準
データをある特定の規則に従って並べ替えることを「ソートする」というのですが、orderbyでは、記事をどんな項目に沿ってソートさせるかを決めます。ここでは、meta_keyを指定し、カスタムフィールドのキーに沿って並び替えを行っています。

他にも代表的な項目として下記があります。

順序づけパラメータ 意味
date 投稿日
modified 更新日
name スラッグ
rand ランダム
ID 投稿ID(大文字です)
title タイトル
    ‘order’ => ‘ASC’ // 昇順・降順
orderでは、orderbyで指定した項目を昇順(ACB順)で並べるのか、降順(ACB順の反対)で並べるのかを指定できます。

ASC: 昇順
DESC: 降順

ちなみに初期値は、'DESC'になっていますので、デフォルトで良い場合はわざわざ指定せずにまるごと行を削除してしまってもかまいません。

));
global $post;
global $post;は、グローバル宣言と言われるものです。$postは、現在の投稿に関する情報が詰まった変数でWordPress全体で使用されています。

そのため、これを使用する際は前もって宣言が必要になります。テンプレート内で使用する文には宣言は必要がないみたいですが、一応、どこで使用してもトラブルがないよう宣言を入れてあります。

if($custom_posts): foreach($custom_posts as $post): setup_postdata($post); ?>

if(条件): 真の場合の処理;

という形でif文になっていますので、カッコの中の変数$custom_postsの中身が空でない場合は「真」とて扱われます。つまり、次のforeach...が実行されるということです。

foreach($custom_posts as $post):は、foreach文といって、

foreach(配列変数 as 変数):

という仕組みになっています。「配列変数」のところに入っている記事の配列(記事のまとまり)が$postという変数として1つずつ取り出されます。

さらに、setup_postdata($post);のところでは、それぞれの記事をページで表示できるように整えて(セットして)います。

 
<!– ループはじめ –>
<h3><a href=”<?php the_permalink() ?>”><?php the_title(); ?></a></h3>
<p><?php the_time(‘Y/m/d’) ?></p>
<p><?php the_excerpt(); ?></p>
<!– ループおわり –>
 
<?php endforeach; endif; wp_reset_postdata(); ?>
foreach文の終了、if文の終了とsetup_postdata($post);のところで変更してしまった$postの投稿に関する情報をリセットしています。

今回のポイントは下記の3つです。

'meta_key' => 'カスタムフィールドのキー',

上記の部分で、カスタムフィールドのキーを指定しています。

'orderby' => 'meta_value',

キーを指定した上で、それが投稿の表示順を決める基準になりますという意味です。

'order' => 'ASC'

ASCを指定すると昇順、DESCを指定すると降順になります。

以上が、カスタム投稿タイプをカスタムフィールドの値で並び替えさせるサブループの作り方でした。

最近の記事

  1. WordPress

    WordPressの立ち上げからサイト構築までの初期手順
  2. CSS

    レスポンシブウェブデザインの基本|メディアクリエリの設定
  3. CSS

    要素の配置が簡単に決まるFlexboxの使い方
  4. CSS

    CSS|中央寄せが効かないときは・・・
  5. CSS

    擬似クラス「:first-child」「:last-child」はどうして効かな…
PAGE TOP