當要查詢 WooCommerce 商品的時候,我偏好使用 wc_get_products
來取得商品列表,跟直接使用 wp_query
比起來,前者提供的參數可以用更簡潔的寫法來依照商品的條件來查詢,像是售價、銷售量或是庫存量等等。
我的需求是要依照商品的販售期限進行查詢,我用 ACF 增加了一個商品下架日期欄位叫做 end_date
,當超過這個期限時商品就會自動下架,因此我要篩選出 end_date
符合當天日期的商品來改變商品的販售狀態。
但與 wp_query
的用法不同,wc_get_products
並未提供自訂欄位的參數,需要透過勾點 woocommerce_product_data_store_cpt_get_products_query
來加入,在勾點中要先判斷查詢的參數是否有帶入,有的話再用 meta_query
加入查詢。
實作如下:首先先在 wc_get_products
的參數帶入 end_date
,並給一個 yes 的值作為稍後查詢的判斷:
$args = array(
'type' => 'variable',
'return' => 'ids',
'end_date' => 'yes',
);
$product_ids = wc_get_products( $args );
然後在勾點 woocommerce_product_data_store_cpt_get_products_query
裡面進行 end_date
的檢查,有存在的話就加入 meta_query
來修改查詢結果,這樣就能正確篩選出符合條件的商品:
add_filter('woocommerce_product_data_store_cpt_get_products_query',function(){
if ( 'yes' === $query_vars['end_date'] ) {
$query['meta_query'][] = array(
array(
'key' => 'end_date',
'value' => date( 'Y/m/d' ),
'compare' => '=',
'type' => 'DATE',
),
);
}
return $query;
})