WooCommerce: отображать ТОЛЬКО продаваемые товары в магазине
Мне нужно создать страницу архива продуктов (обычно Магазин в WooCommerce), но отображает ТОЛЬКО продукты ON SALE. В основном он должен использовать тот же шаблон макета, что и в archive-product.php
. Будет ссылка в главном меню, которое будет направлено на эту страницу. Как мне это сделать?
UPDATE
Мне удалось отфильтровать продукты ON SALE с помощью кода ниже, расположенного чуть выше строки if ( have_posts() ) :
...
$args = array(
'post_type' => 'product',
'order' => 'ASC',
'paged' => $paged,
'meta_query' => array(
array(
'key' => '_sale_price',
'value' => 0,
'compare' => '>',
'type' => 'numeric'
)
)
);
query_posts( $args );
Код помещается в копировать из archive-product.php
, который я назвал archive-product_sale.php
и сделан как шаблон страницы.
Однако это работает только для простых продуктов, и мне нужно, чтобы он работал как для продуктов Simple, так и для Variable.. p >
Ответы
Ответ 1
@mirus 'ответ на короткий код дал мне идею проверить, как WooCommerce запрашивает только товары для продажи. Очевидно, WooCommerce имеет функцию wc_get_product_ids_on_sale()
, которая вернет идентификаторы продаваемых товаров. Затем мы можем легко настроить запрос с помощью параметра post__in
, чтобы возвращать только те конкретные элементы.
WooCommerce имеет woocommerce_product_query
хук в классе class-wc-query.php
, который позволяет нам модифицировать запрос до его запуска... он запускается на pre_get_posts
, который является обычным местом для изменения запроса. Использование Woo-крючка означает, что вы разрешаете им обрабатывать большую часть условной логики о том, когда следует применять эту модификацию запроса.
add_action( 'woocommerce_product_query', 'so_20990199_product_query' );
function so_20990199_product_query( $q ){
$product_ids_on_sale = wc_get_product_ids_on_sale();
$q->set( 'post__in', $product_ids_on_sale );
}
Ответ 2
Мне удалось отфильтровать продукты ON SALE с кодом ниже , размещенным чуть выше строки if ( have_posts() ) :
...
$args = array(
'post_type' => 'product',
'meta_query' => array(
'relation' => 'OR',
array( // Simple products type
'key' => '_sale_price',
'value' => 0,
'compare' => '>',
'type' => 'numeric'
),
array( // Variable products type
'key' => '_min_variation_sale_price',
'value' => 0,
'compare' => '>',
'type' => 'numeric'
)
)
);
query_posts( $args );
Код помещается в копию archive-product.php
, которую я переименовал archive-product_sale.php
и сделал как шаблон страницы.
Ответ 3
@gmaggio с помощью query_posts() разорвет ваш сайт.
Используйте pre_get_posts
add_filter( 'pre_get_posts', 'catalog_filters' );
function catalog_filters( $query ) {
if ( $query->is_main_query() && $query->post_type = 'product' ) {
if(isset($_GET['onsale'])) {
$meta_query = array(
'relation' => 'OR',
array( // Simple products type
'key' => '_sale_price',
'value' => 0,
'compare' => '>',
'type' => 'numeric'
),
array( // Variable products type
'key' => '_min_variation_sale_price',
'value' => 0,
'compare' => '>',
'type' => 'numeric'
)
); $query->set('meta_query', $meta_query); d($query);
}
if(isset($_GET['bestsellers'])) {
$meta_query = array(
array(
'key' => 'total_sales',
'value' => 0,
'compare' => '>',
'type' => 'numeric'
)
);
}
}
return $query;
}
Ответ 4
Создайте новую страницу с помощью короткого кода [sale_products per_page="12"]
Список доступных коротких кодов и их параметров находится здесь: http://docs.woothemes.com/document/woocommerce-shortcodes/
Ответ 5
Решение для переменных и простых продуктов:
add_action( 'save_post_product', 'update_product_set_sale_cat_var' );
function update_product_set_sale_cat_var( $post_id ) {
$sales_ids = wc_get_product_ids_on_sale();
foreach ( $sales_ids as $sale_id ) :
if ($sale_id == $post_id) :
wp_set_object_terms($post_id, 'sale', 'product_cat', true );
else :
if ( has_term( 'sale', 'product_cat', $post_id ) ) {
wp_remove_object_terms( $post_id, 'sale', 'product_cat' );
}
endif;
endforeach;
}