web-dev-qa-db-ja.com

変更日によるカスタム投稿タイプの順序とカスタムメタフィールドの問題

ユーザーが公開できるような種類のオファーを含むプラグインを作成しています。ユーザーは、カスタム管理パネルで自分のオファーを管理できます。オファーは無料でプレミアムです。オファーがプレミアムの場合、それは全リストの中の無料オファーの上で行われます。ユーザーはプレミアムオファーを毎日更新できるため、更新されたオファーはリストの一番上に表示されます。

私はこれを次のように考え出しました:offerはcustom fields "premium"を持ち、offerが "premium"の場合値は "2"、それ以外の場合(無料オファー)は値は "1"です。

ユーザーがプレミアムオファーを更新すると、'post_modified'が変更されます。

これを実現するには、どのようなクエリを実行する必要がありますか?リストの一番上にある最新の(最新の更新日を含む)プレミアムオファー(カスタムメタ「premium」が「2」に等しい)およびその下のオファー。

私の実際のクエリは次のようになります。

$args = array(
    'post_type' => 'mycustomposttype',
    'post_status' => 'publish',
    'paged' => $paged,
    'meta_key' => 'premium',
    'orderby' => 'modified meta_value_num',
    'order' => 'ASC',
    'meta_query' => array(
        array(
        'key' => 'paid',
        'value' => array('paid','free'),
        'compare' => 'IN'
        )
    ),
);

しかし、最新のオファーはリストの最後にあります。注文を 'DESC'に変更したときでも。どんな助け(またはこれをするための新しい方法)も大いに感謝するでしょう。

2
Kamil

私があなたを理解しているならば、私は以下があなたが必要とすることをすると信じます:

function orderby_mod_wpse_140999($orderby) {
  remove_action('posts_orderby','orderby_mod_wpse_140999');
  global $wpdb;
  return $orderby.", {$wpdb->posts}.post_modified DESC";
}
add_filter('posts_orderby','orderby_mod_wpse_140999');

$args = array(
  'meta_key' => 'premium',
  'orderby' => 'meta_value',
  'order' => 'ASC'
);
$q = new WP_Query($args);
var_dump($q->request);

キー名が間違っているかもしれませんし、pre_get_postsアクションとして書き直されているかもしれません(おそらくそうです):

function orderby_mod_wpse_140999($orderby) {
  remove_action('posts_orderby','orderby_mod_wpse_140999');
  global $wpdb;
  return $orderby.", {$wpdb->posts}.post_modified DESC";
}
add_filter('posts_orderby','orderby_mod_wpse_140999');

function pgp_orderby_mod_wpse_140999($qry) {
  if ($qry->is_main_query() && is_archive()) {
    $qry->set('meta_key','premium');
    $qry->set('orderby','meta_value');
    $qry->set('order','ASC');
  }
}
add_action('pre_get_posts','pgp_orderby_mod_wpse_140999');

繰り返しますが、私は少し推測しています。 pre_get_postsソリューションの場合、コードはフックがメインクエリに適用される場所に移動する必要があります。

1
s_ha_dum