使用 WC_Query 获取销售的 WooCommerce 产品

Posted

技术标签:

【中文标题】使用 WC_Query 获取销售的 WooCommerce 产品【英文标题】:Get WooCommerce products on sale with WC_Query 【发布时间】:2014-07-13 23:07:40 【问题描述】:

我知道互联网上有很多关于如何通过 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

被填充。

任何帮助表示赞赏! 谢谢!!!

【问题讨论】:

【参考方案1】:

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' );

【讨论】:

是的 - 我想我可以创建自己的版本。但是,这仍然不能解决 WC_Query 没有被填充的问题,这意味着过滤器和产品计数等将不起作用。 确实如此。我又看了看,想出了一些新的东西。没有保证,但我希望它会有所帮助。 干得好,把我从一个洞里挖出来,开辟了一些可能性:)

以上是关于使用 WC_Query 获取销售的 WooCommerce 产品的主要内容,如果未能解决你的问题,请参考以下文章

Woocommerce如何处理订阅结算?

在一行 BigQuery 中获取今年的销售额和去年的销售额(对于同一周数)

在循环之外获取当前变体 id 并将其用于服务器端功能。 WooCommerce / jQuery

如何从新的 Paypal Sync Api 获取销售 ID

Amazon Redshift - 按类别获取每周销售量

有没有办法从 PayPal 销售 ID 中获取 ItemList?