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

时间:2018-02-23 12:59:06

标签: php wordpress woocommerce shortcode product

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

然而,我的Wordpress主题是动态的(它适用于所有产品类别),我无法使用每个产品类别的短代码创建一个页面(某些类别已创建"在旅途中&# 34;当我添加新产品时)。

有没有什么方法可以让我们只使用查询字符串来返回仅限销售产品的类别?

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

---编辑:---

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

忘了提一下,在我的情况下,我总是对" _regular_price"和" _sale_price"无论是否在售。以下是示例:

产品出售(价格不同): enter image description here

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

2 个答案:

答案 0 :(得分: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', '>=');
    }

}

答案 1 :(得分:0)

在您的产品类别档案页面上显示"在销售中"产品在GET请求中,请使用此专用 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 ......