BLOG

カスタムフィールドを使ってソートをする

| 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 );

ざっくり、メモ書きですが参考になればと思います。

PAGE TOP