web-dev-qa-db-ja.com

Wordpressでtax_queryとdate_queryを組み合わせる方法

次のクエリを使用して、「サービス」商品カテゴリにない商品をすべて抽出し、カスタムメタフィールド「_vintage_age」でそれらを並べ替えます。

$q->set( 'tax_query', array(array(
    'taxonomy' => 'product_cat',
    'field' => 'slug',
    'terms' => array( 'Service' ),  
    'operator' => 'NOT IN'
)));

$q->set('meta_query',array(array(
    'vtp_age' => array(
    'key' => '_vintage_age',
    'value' => array(1,2,3),
    'compare' => 'IN'
))));

$q->set('orderby',array(
    'vtp_age' => 'ASC',
    'date' => 'ASC'
));

このクエリを1か月以上前にproduct_category 'Sold'で変更されたEXCLUDE商品に拡張する必要があります(つまり、売れ残りのないサービスのない商品と先月販売した商品をすべて表示する)。私の推測では、このようなものを使用することですが、どうすればこれを「販売済み」製品にのみ適用し、それを元のクエリに追加することができますか。

array(
    'date_query' => array(
        array(
            'column' => 'post_modified_gmt',
            'after'  => '1 month ago',
        ),
))

ご協力ありがとうございます。

1
Richard Tinkler

WP_Queryを使用してそのような高度なクエリを実行する方法がないのは怖いです。

しかし、もちろん、その結果を得ることはできますが、もう少しコードを書く必要があります。

解決策は2つあります。

質問には詳細があまりないので正確なコードを提供するのは難しいですが、おそらくこれで十分でしょう:)

1. posts_whereposts_joinフィルタを使う

独自のSQLクエリを書くことを恐れていないのであれば、posts_whereおよびposts_joinフィルタを使用してWP_Queryにさらに高度なSQL条件を追加することができます。

2. 2番目のWP_Queryを使用してから、これらの投稿を除外します

生のSQLが気に入らない場合は、2番目のWP_Queryを使用できます。除外するすべての投稿を選択するために使用します。それからあなたはそれらのIDを使用して、あなたの現在のWP_Queryにpost__not_inパラメータとしてそれらを渡すことができます - この方法であなたはそれらを除外します。

2