我需要创建产品存档页面(通常是商店页面 WooCommerce ),但只显示 出售产品。基本上它应该使用与archive-product.php
中相同的模板布局。主菜单中将有一个指向此页面的链接。我该怎么做?
我设法过滤掉 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
并制作为页面模板。
但是,这仅适用于简单产品类型,我需要它适用于简单产品和变量产品类型。
答案 0 :(得分:14)
@ Mirus公司'关于短代码的答案给了我一个想法,看看WooCommerce如何只询问销售商品。显然,WooCommerce有一个wc_get_product_ids_on_sale()
功能,它将返回销售商品的ID。然后,我们可以使用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 );
}
答案 1 :(得分:9)
我设法过滤掉了 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
并制作为页面模板。
答案 2 :(得分:6)
@gmaggio使用query_posts()will break your site。 使用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;
}
答案 3 :(得分:0)
使用短代码[sale_products per_page="12"]
可用的短代码及其参数列表如下:http://docs.woothemes.com/document/woocommerce-shortcodes/
答案 4 :(得分:0)
可变和简单产品的解决方案:
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;
}