[wordpress]functions.phpに条件を追加して、リストを並び替えるpre_get_postsフィルター

「pre_get_postsフィルター」を使う方法を詳しく説明してくださっているWEBサイトを発見。とても勉強になりました。
functions.phpに書くので、Ktai-Styleを利用した携帯ページ(スマフォページ)にも反映できて便利です。

参照:「notnil creation weblog」query_postsを捨てよ、pre_get_postsを使おう【追記あり】【報告あり】

今後は、この方法が主流になるらしいですし見逃せません。

具体的には、トップページ、アーカイブページ、カテゴリー一覧ページ、検索結果ページなど、
降順、昇順、カスタムフィールド値で並び替える等、条件をfunctions.phpにセットしておきます。

カテゴリーIDをセットして、任意のカテゴリーの記事のみ一覧することも出来るので、トップページに「新着情報」カテゴリーの記事を一覧するとか・・・に使えそう。

各テンプレートには、普通にループだけでOKです。

[php]

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<a href="<?php the_permalink() ?>"><?php the_title(); ?></a>
<?php endwhile; endif; ?>

[/php]

下記は、会員情報一覧ページで五十音順にリストする際に利用しています。(カスタムフィールドに’ふりがな’を、ひらがなで登録)
トップページと各リストページで、カスタムフィールド値が「ふりがな」の記事を、昇順で並び替えて、1ページに20個リストするように指定しています。
(トップページのみ、カテゴリーID2に属する記事をリストするように指定)

[php]
/**並び替え**/
function customize_main_query($query) {

if ( is_admin() || ! $query->is_main_query() )
return;

if ( $query->is_home() ) {
$query->set( ‘posts_per_page’, ’20’ );
$query->set( ‘order’, ‘ASC’);
$query->set( ‘cat’, ‘2’);
$query->set(
‘meta_query’,
array(
‘relation’ => ‘AND’,
array(
‘key’ => ‘ふりがな’,
)
)
);
}

if ( $query->is_category() ) {
$query->set( ‘posts_per_page’, ’20’ );
$query->set( ‘order’, ‘ASC’);
$query->set(
‘meta_query’,
array(
‘relation’ => ‘AND’,
array(
‘key’ => ‘ふりがな’,
)
)
);
}

if ( $query->is_archive() ) {
$query->set( ‘posts_per_page’, ’20’ );
$query->set( ‘order’, ‘ASC’);
$query->set(
‘meta_query’,
array(
‘relation’ => ‘AND’,
array(
‘key’ => ‘ふりがな’,
)
)
);
}

if ( $query->is_search() ) {
$query->set( ‘posts_per_page’, ’20’ );
$query->set( ‘order’, ‘ASC’);
$query->set(
‘meta_query’,
array(
‘relation’ => ‘AND’,
array(
‘key’ => ‘ふりがな’,
)
)
);
}

if ( $query->is_tag() ) {
$query->set( ‘posts_per_page’, ’20’ );
$query->set( ‘order’, ‘ASC’);
$query->set(
‘meta_query’,
array(
‘relation’ => ‘AND’,
array(
‘key’ => ‘ふりがな’,
)
)
);
}

}
add_action( ‘pre_get_posts’, ‘customize_main_query’ );
[/php]

カスタムフィールドパラメータ

wordpress codex [関数リファレンス/WP_Query]

[メモ]

[php]
‘key’ => ‘文字列’,
‘value’ => ‘文字列または配列’,
‘compare’ => ‘=’,
‘type’ => ‘CHAR’
[/php]

relation AND,OR  
key カスタムフィールドの名前 (例)’price’
value カスタムフィールドの値を文字列、
または配列(複数の値を指定する場合)
(例)array( 3000, 5000)
type 値(’value’)のデータ型 
‘NUMERIC’、’BINARY’、’CHAR’、’DATE’、’DATETIME’、
‘DECIMAL’、’SIGNED’、’TIME’、’UNSIGNED’
(例)’NUMERIC’
(数値を扱う)
compare ‘!=’、’>’、’>=’、'<'、'<='、'LIKE'、'NOT LIKE'、
‘IN’、’NOT IN’、’BETWEEN’、’NOT BETWEEN’
(例)’BETWEEN’
(値の範囲)

(例)カスタムフィールド値で抽出する] $query->set
(ベッドに属する商品で、価格が3500円~4000円の商品をリスト)

[php]
$query->set(
‘meta_query’,
array(
‘relation’ => ‘AND’,
array(
‘key’ => ‘ベッド’,
),
array(
‘key’ => ‘価格’,
‘value’ => array( 3500, 4000 ),
‘type’ => ‘numeric’,
‘compare’ => ‘BETWEEN’
)
)
);
[/php]