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

公開日:2013年9月2日

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

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

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

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

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

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


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

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

/**並び替え**/
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' );

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

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

[メモ]

'key' => '文字列',
'value' => '文字列または配列',
'compare' => '=',
'type' => 'CHAR'

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円の商品をリスト)

      $query->set(
        'meta_query',
              array(
                'relation' => 'AND',
                  array(
                       'key' => 'ベッド',
                       ),
                  array(
                       'key' => '価格',
                       'value' => array( 3500, 4000 ),
                       'type' => 'numeric',
                       'compare' => 'BETWEEN'
                       )
                    )
                  );