カスタムフィールドを使ってソートをする
| WordPress、WordPressプラグインWordPressでソートって普通は記事を書いた日時ですると思うんですが、商品ページとかそういうのではカスタムフィールドでソートをしたりします。
単体のカスタムフィールドでソート
普通にカスタムフィールドでソートをする方法としてはこんな感じですよね。
$args = array(
'post_type' => 'post',
'posts_per_page' => -1,
'meta_key' => 'key',
'meta_value' => 'value',
'orderby' => 'meta_value',
'order' => 'ASC',
);
$the_query = new WP_Query($args);
$args = array(
'post_type' => 'post',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => 'key',
'value' => 'value',
'compare' => '='
)
),
'meta_key' => 'key',
'orderby' => 'meta_value',
'order' => 'asc'
);
$the_query = new WP_Query($args);
複数のカスタムフィールドでソート
複数のカスタムフィールドはこんな感じ
$args = array(
'post_type' => 'post',
'posts_per_page' => -1,
'meta_query' => array(
'relation' => 'AND',
'area' => array(
'key' => 'area',
'type' => 'BINARY',
),
'group' => array(
'key' => 'group',
'type' => 'BINARY',
),
),
'orderby' => array(
'pickup' => 'DESC',
'group' => 'ASC',
)
);
$the_query = new WP_Query($args);
ちょっと特殊な方法はこんな感じです。
SQL文を使ってソートをしていきます。
// functions.php
function custom_posts_join( $join, $query ) {
global $wpdb;
$join .= " INNER JOIN $wpdb->postmeta AS m1 ON m1.post_id = $wpdb->posts.ID AND m1.meta_key = 'sortField'";
return $join;
}
function custom_posts_orderby( $orderby, $query ) {
global $wpdb;
$orderby = "";
$orderby .= "m1.meta_value DESC, post_date DESC";
return $orderby;
}
// 設定したい箇所
add_filter( 'posts_join', 'custom_posts_join', 10, 2 );
add_filter( 'posts_orderby','custom_posts_orderby', 10, 2 );
値の有無でソートしたいとかそういうのはこんな感じですかね。
// functions.php
function custom_posts_join( $join, $query ) {
global $wpdb;
$join .= " INNER JOIN $wpdb->postmeta AS m1 ON m1.post_id = $wpdb->posts.ID AND m1.meta_key = 'factoryid'";
$join .= " INNER JOIN $wpdb->postmeta AS m2 ON m2.post_id = $wpdb->posts.ID AND m2.meta_key = 'sortField'";
return $join;
}
function custom_posts_orderby( $orderby, $query ) {
global $wpdb;
$orderby = "";
$orderby .= "case when m1.meta_value = NULL then 2 when m1.meta_value = '' then 1 else 0 end,";
$orderby .= "m2.meta_value DESC, post_date DESC";
return $orderby;
}
// 設定したい箇所
add_filter( 'posts_join', 'custom_posts_join', 10, 2 );
add_filter( 'posts_orderby','custom_posts_orderby', 10, 2 );
ざっくり、メモ書きですが参考になればと思います。