##「本の一覧を出版元の50音順でソートしたい」
WordPressで「書籍」「出版社」をそれぞれ別のカスタム投稿タイプで登録してSmart Custom Fieldsの「関連する投稿」などで紐付けている場合に、書籍の一覧を出版社のカスタムフィールドに登録された“よみがな”でソートする。
search.php
if ( have_posts() ) :
while ( have_posts() ) : the_post();
// 書籍に関連付けされた出版社のIDを取得
$member_id = get_post_meta( $post->ID, 'member', true );
// 出版社のよみがなを取得
$member_yomigana = get_post_meta( $member_id, 'yomigana', true );
// $postオブジェクトに“よみがな”を追加
$post->member_yomigana = $member_yomigana;
endwhile;
/********************************
* 取得した書籍情報を出版社の“よみがな”で並べ替える
* 第一引数=ソートする配列, 第二引数=ソートに使う比較関数を定義
* 比較関数から返された値の順にソート
********************************/
usort ( $posts, function ( $a, $b ) {
$member_a = $a->member_yomigana;
$member_b = $b->member_yomigana;
if ( $member_a && $member_b ) :
// 前者が大きければ正の値、後者が大きれば負の値、同じならゼロを返す
$value = strcasecmp( $member_a, $member_b );
else :
// よみがながない場合は最後尾へ
$value = 99999999;
endif;
return $value;
} );
// ループを巻き戻す
rewind_posts();
while ( have_posts() ) : the_post();
// 記事表示部分
endwhile;
endif;
- 要点1 ループをrewind_postsで巻き戻して2度回し、ソートと表示の処理を分ける
- 要点2 “よみがな”を取得して $post オブジェクトに突っ込む
- 要点3 usort関数で、“よみがな”を元に $posts をソートする
“よみがな”がなかった場合に返す"99999999"という値は適切かわからないが、"ソート最高尾に持っていくのに十分に大きい値"という意味。
###降順(逆順)にソートする場合
$valueに「-1」を掛けて、
return ( $value * -1 );
とすればいい。
###参考
http://php.net/manual/ja/function.usort.php
http://php.net/manual/ja/function.strcasecmp.php
http://php-archive.net/php/kana-sort/
https://ja.wordpress.org/plugins/smart-custom-fields/