4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

記事のソートを別の投稿タイプのカスタムフィールドの値でおこなう

Last updated at Posted at 2017-08-07

##「本の一覧を出版元の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/

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?