Advanced Custom Fieldsでフィルター&ソートのおぼえがき。

毎度毎度このAdvanced Custom Fieldsプラグインにはお世話になってるのですが、久しぶりにハマったのでメモ。

クライアントのサイトで、西暦、日付、タイトルの一覧を作る必要があって、それを西暦ごとに別々に一覧を用意し、日付でソートしたかったんだけど、なんでか思ったとおりにソートされず、、数時間悩みました。

表示させるページはcategory.phpなので、データの中身自体はcontent.phpで、loopさせることになります。
一覧させるのでtableかdlで囲うので今回は気分でtableつかいました。
content.phpの中身はこんなかんじ。loopするので<table></table>の部分だけcategory.phpに書きます。

<tr>
	<th><?php $date = date_create(''.get_field('日付の変数名').'');
	 echo date_format($date,'Y/m/d'); ?></th>
	<td><a href="<?php the_field('link_url',$post_id); ?>" target="_blank">
	<?php the_title(); ?></a></td>
</tr>

ここは普通にACFの使い方でOKなのだけど、これだけだとズラズラっと全部がでちゃうので、年号ごとにブロックで表示できるようにしたかったわけです。

気分的にはまず年号でフィルタした後に並び替えをするものだと思ってたので、そう書いていましたが、見事に逆でした。考え方としては並び替えた後に年号でフィルタするようです。なんだか処理が重そうですが、そうみたいです。

無事に出力できたコードはこちら。

<?php
/* Start the Loop */
// args
$args = array(
	'meta_key'		=> '日付の変数',
	'order'			=> 'DESC',
	'showposts'		=> 30,
	'orderby'		=> 'meta_value_num',
	'meta_query'	=> array(
		'relation'	=> 'AND',
		array(
			'key'		=> '西暦の変数名',
			'value'		=> '2013'
		)
	)
 );
// query
$wp_query = new WP_Query( $args );
while ( have_posts() ) : the_post();
	get_template_part( 'content', 'cat' );
endwhile;
twentytwelve_content_nav( 'nav-below' );
?>

meta_keyで日付の変数を入れて、orderで並び替え、showpostsで30件を指定。
relationでANDの指定をして、追加の条件を入れます。試してないけど、”AND”じゃなくて、”OR”にすれば複数条件での指定もできるはず。

keyに西暦の変数名を入れたらvalueで取り出したい値(今回は2013年を取り出したかったので、ACFで西暦のフィールドに2013とはいっているもの。)を指定します。
その下はループのデータを引っ張る部分なので、特に変更なし。今回はcontent-cat.phpというファイルからデータを引っ張ってきているので、「get_template_part( ‘content’, ‘cat’ );」としてるだけ。

本当は、西暦も入れた状態で普通に一覧をすればこんなこと必要ないけど細かいデザインの問題で、今回はこの方法。

Leave a Reply

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です