「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]