Woocommerce 在为产品设置自定义折扣后按价格排序

Woocommerce sort by price after set custom discount on product

我通过 functions.php 在所有产品中添加了自定义折扣,因为我们想要 运行 基于特定品牌的活动。

价格显示在产品页面、产品列表和购物车页面中。

//Change price in product and product list
add_filter( 'woocommerce_get_price_html', 'set_discount_by_brand', 9999, 2 );
function set_discount_by_brand( $price_html, $product ) {

    $discount = 0.25;
    $brand = $product->get_attribute('pa_brand');
    if ($brand == 'MY BRAND') {
        $regular_price = $product->get_regular_price();
        $sale_price = $regular_price*(1-$discount);
        $price_html = '<del>' . ( is_numeric( $regular_price ) ? wc_price( $regular_price ) : $regular_price ) . '</del> <ins>' . ( is_numeric( $sale_price ) ? wc_price( $sale_price ) : $sale_price ) . '</ins>';
    }
    
    return $price_html;
}

//Change price in cart item
add_action( 'woocommerce_before_calculate_totals', 'discount_price_cart_by_brand', 9999 );
function discount_price_cart_by_brand( $cart ) {
 
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) return;
 
    // Apply discount to cart
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        $product = $cart_item['data'];
        $product_id = $product->get_id();
        $discount = 0.25;
        $brand = $product->get_attribute('pa_brand');
        if ($brand == 'MY BRAND') {
            $regular_price = $product->get_regular_price();
            $sale_price = $regular_price*(1-$discount);
            $cart_item['data']->set_price( $sale_price );
        }
    }
}

我的问题是当我尝试按价格(升序和降序)对产品进行排序时。我知道基于 meta_key _price 的排序,但我不想对数据库进行任何更改。

我还想添加一个名为 _sorting_price 的自定义 meta_key 并再次计算基于折扣的所有价格。

//Sort by custom meta_key
add_filter('woocommerce_get_catalog_ordering_args', function ($args) {
    $orderby_value = isset($_GET['orderby']) ? wc_clean($_GET['orderby']) : apply_filters('woocommerce_default_catalog_orderby', get_option('woocommerce_default_catalog_orderby'));
        if ('price' == $orderby_value) {
            $args['orderby'] = 'meta_value_num';
            $args['order'] = 'ASC';
            $args['meta_key'] = '_sorting_price';
        }
    
        if ('price-desc' == $orderby_value) {
            $args['orderby'] = 'meta_value_num';
            $args['order'] = 'DESC';
            $args['meta_key'] = '_sorting_price';
        }
    return $args;
});

但我想先尝试另一种选择,而不是在 postmeta 中添加 10000 行 table。

有谁知道我是否可以通过 functions.php 做到这一点?

谢谢

因为您是通过过滤器执行此操作并且只是调整显示价格,所以无法通过内置函数执行此操作。

您也可以使用单独的 table 来执行此操作,而不是向 postmeta 添加更多数据。这将使稍后删除变得更容易,因为您可以在完成后删除 table。

您可以以编程方式更新所有待售产品,这将适用于默认排序。