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。
您可以以编程方式更新所有待售产品,这将适用于默认排序。
我通过 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。
您可以以编程方式更新所有待售产品,这将适用于默认排序。