首页 文章

使用Get请求获取Woocommerce产品类别档案的销售产品

提问于
浏览
1

我希望能够只在我的网站上显示任何类别的产品 . 我看到你可以使用Woocommerce shortcodes .

然而,我的Wordpress主题是动态的(它适用于所有产品类别),我无法使用每个产品类别的短代码创建一个页面(当我添加新产品时,某些类别是“随时随地”创建的) .

有什么方法我可以简单地使用查询字符串返回仅与销售产品类别?

例如: https://www.website.com/clothing/dresses?on_sale=true

  • -编辑: - -

我没有使用短代码,只想要一个简单的查询参数解决方案 .

忘了提一下,就我的情况而言,我总是对“_regular_price”和“_sale_price”都有 Value ,无论是否在售 . 以下是示例:

产品 ON SALE (价格不同):
enter image description here

产品 NOT 发售(价格相同):
enter image description here

2 回答

  • 1

    您需要通过pre_get_posts过滤器更改主查询 .

    add_action( 'pre_get_posts', 'modify_query_show_on_sale_products' );
    
    function modify_query_show_on_sale_products( $query ) {
    
        if( ! is_admin() && $query->is_main_query() && $query->query_vars['wc_query'] == 'product_query' ) {
    
            $query->set('meta_key', '_sale_price');
            $query->set('meta_value', '0');
            $query->set('meta_compare', '>=');
        }
    
    }
    
  • 0

    要在您的产品类别档案页面"on sale"产品 on a GET request 上显示,请使用此自定义函数挂钩 dedicated woocommerce_product_query 动作挂钩 .

    这适用于产品类别归档页面中的GET参数,例如: https://www.website.com/clothing/dresses?on_sale=true .

    代码:

    add_action( 'woocommerce_product_query', 'on_sale_products_in_product_category_archives', 20, 2 );
    function on_sale_products_in_product_category_archives( $q, $query ) {
        // Only on product category archive pages
        if( is_admin() || is_search() || ! is_product_category() )
            return;
    
        if( ! isset($_GET['on_sale']) )
            return;
    
        if( $_GET['on_sale'] === '1' ){
            // Get the queried product category term ID
            $term_id = get_queried_object()->term_id; 
    
            // Get related "on sale" product Ids for this product category ID
            global $wpdb;
            $product_ids = $wpdb->get_col( "
                SELECT p.ID FROM {$wpdb->prefix}posts as p
                INNER JOIN {$wpdb->prefix}term_relationships as tr ON p.ID = tr.object_id
                INNER JOIN {$wpdb->prefix}term_taxonomy as tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
                INNER JOIN {$wpdb->prefix}terms as t ON tt.term_id = t.term_id
                WHERE ( p.ID IN ( SELECT DISTINCT p2.ID FROM {$wpdb->prefix}posts as p2
                    INNER JOIN {$wpdb->prefix}postmeta as pm ON p2.ID = pm.post_id
                    INNER JOIN {$wpdb->prefix}postmeta as pm2 ON p2.ID = pm2.post_id
                    AND pm.meta_value != pm2.meta_value
                    WHERE p2.post_type = 'product' AND p2.post_status = 'publish'
                    AND pm.meta_key LIKE '_regular_price' AND pm2.meta_key LIKE '_sale_price'
                    AND pm2.meta_value != ''
                ) OR p.ID IN ( SELECT DISTINCT p3.post_parent FROM {$wpdb->prefix}posts as p3
                    INNER JOIN {$wpdb->prefix}postmeta as pm3 ON p3.ID = pm3.post_id
                    INNER JOIN {$wpdb->prefix}postmeta as pm4 ON p3.ID = pm4.post_id
                    AND pm3.meta_value != pm4.meta_value
                    WHERE p3.post_type = 'product_variation' AND p3.post_status = 'publish'
                    AND pm3.meta_key LIKE '_regular_price' AND pm4.meta_key LIKE '_sale_price'
                    AND pm4.meta_value != ''  AND p3.post_parent != 0
                ) ) AND tt.taxonomy LIKE 'product_cat' AND tt.term_id = $term_id
            " );
    
            // Set those products IDs in the WP_Query
            $q->set('post__in', $product_ids);
        }
    }
    

    代码位于活动子主题(或主题)的function.php文件中 .

    经过测试,适用于所有产品类型(甚至可变产品)

    由于这必须适用于所有产品类型,甚至是可变产品,并且为了比较不同的价格值,这对于WP_Query来说是复杂的 . 所以我在函数中有一个SQL查询来获取相关的“On sale”产品ID ...

相关问题