我知道互联网上有很多关于如何通过 WP_Query 来销售WooCommerce产品的解决方案。但是,如果没有填充 WC_Query 对象,WooCommerce似乎无法完全运行。例如:过滤或排序
这两个模板都会调用:
woocommerce_products_will_display()
检查页面是否为分类页面(如果您使用自己的自定义模板,则显然是错误的):
if ( ! is_product_taxonomy() ) return false;
如果您只想要产品,这是一个简单解决方案的示例:WooCommerce: Display ONLY on-sale products in Shop
所以,我在这里似乎需要解决几个问题:
1)如何告诉WC我的“销售”页面是一个分类页面?是否需要某种技巧来强制它进入分类法?
2)如何让WC_Query填满销售查询(而不仅仅是WP_Query)
我有依赖的插件:
$woocommerce->query->layered_nav_product_ids
正在填充。
任何帮助表示赞赏! 感谢!!!
答案 0 :(得分:2)
好woocommerce_products_will_display()
是可插入的,这意味着您可以在自己的functions.php(或特定于站点的插件)中对其进行定义并对其进行更改,让它为您的特定模板/页面返回true
。
我认为它可以代表一些调整和过滤器。
修改强>
我多玩了一下这个。通常,更改要检索的帖子是在pre_get_posts
挂钩中完成的。我看了一下WooCommerce在做什么。他们正在向pre_get_posts
钩子添加一些内容并从那里调用他们的特殊查询内容。
但是如果你不在WooCommerce页面上,他们的特殊查询就会消失。所以,它让我觉得我们可以从我们自己的功能中自己调用它。我把它放在一起并加上一个特殊的页面模板,用于一个名为" on-sale" (基本上只是商店模板的副本),似乎只显示具有适当分类和分页的待售商品。
您的里程可能会有所不同,但我希望它有所帮助。
function kia_pre_get_posts( $q ){
// We only want to affect the main query
if ( ! $q->is_main_query() ) {
return;
}
// Fix for verbose page rules
if ( is_page('on-sale') ) {
$q->set( 'post_type', 'product' );
$q->set( 'page_id', '' );
$q->set( 'page', '' );
$q->set( 'pagename', '' );
$meta_query = array( array(
'key' => '_sale_price',
'value' => 0,
'compare' => '>'
) );
$q->set( 'meta_query', $meta_query );
if ( isset( $q->query['paged'] ) ) {
$q->set( 'paged', $q->query['paged'] );
}
// Fix conditional Functions
$q->is_archive = true;
$q->is_post_type_archive = true;
$q->is_singular = false;
$q->is_page = false;
}
$wc_query = WC()->query;
$wc_query->product_query( $q );
if ( is_search() ) {
add_filter( 'posts_where', array( $wc_query, 'search_post_excerpt' ) );
add_filter( 'wp', array( $wc_query, 'remove_posts_where' ) );
}
add_filter( 'posts_where', array( $wc_query, 'exclude_protected_products' ) );
// We're on a shop page so queue the woocommerce_get_products_in_view function
add_action( 'wp', array( $wc_query, 'get_products_in_view' ), 2);
// And remove the pre_get_posts hook
$wc_query->remove_product_query();
}
add_action( 'pre_get_posts', 'kia_pre_get_posts' );