我需要首先设置“特价”产品来更改默认的 woocommerce 过滤器。循环中还必须包含非促销商品,但所有商品均首先按促销商品排序。
我尝试使用pre_get_posts,但我找到了仅过滤产品的方法(例如仅显示在售产品),而不是重新订购。
我解决了问题,这里是解决方案,希望对其他人有用。
/**
* @param $q
* Reorder products on sale first on default shop filter.
*
* @return void
*/
function evolve_on_sale_reorder_query( $q ) {
$meta_query = $q->get( 'meta_query' );
if ( ! isset( $_GET['orderby'] ) ) {
$meta_query = array(
'relation' => 'OR',
array(
'key' => '_sale_price',
'compare' => 'NOT EXISTS'
),
array(
'relation' => 'OR',
array(
'key' => '_sale_price',
'value' => '',
'compare' => "="
// 'value'=>array(''),
// 'compare' => 'IN'
),
array(
'key' => '_sale_price',
'value' => 0,
'compare' => '>=',
'type' => 'numeric',
)
),
);
$q->set( 'orderby', array( 'meta_value' => 'DESC', 'title' => 'ASC' ) );
}
$q->set( 'meta_query', $meta_query );
}
add_action( 'woocommerce_product_query', 'evolve_on_sale_reorder_query' );
_sale_price 元键不适用于可变产品。
对于您可以使用的所有产品
add_filter('posts_orderby', function(){
return 'FIELD(ID, '.implode(', ', wc_get_product_ids_on_sale()).') DESC';
});