按价格对 Woocommerce 产品变体自定义输出进行排序 [英] Sort a Woocommerce product variations custom output by their price
问题描述
Bellow 我有一个基于
您可以看到与变体 ID 的顺序(从最小到最大)匹配的屏幕截图:
我想要的是按价格对变化进行排序,而不是(而不是他们的 ID) 从最低到最高.任何帮助表示赞赏.
这是我当前拥有的自定义代码:
add_shortcode("price_variation_table", "fs_custom_available_variations_table");函数 fs_custom_available_variations_table( $atts ) {全球 $post;//属性$atts = shortcode_atts(大批('id' =>$post->ID),$atts, 'price_variation_table');if( is_admin() ) 返回;//仅在前端$product = wc_get_product($atts['id']);//获取 WC_Product 对象$output = '<div class="fs-product-data-wrapper">';//变量产品if($product->is_type('变量')){//获取变量产品中的可用变体$available_variations = $product->get_available_variations();如果(计数($available_variations)> 0){foreach( $available_variations 作为 $variation )$output .= fs_format_product_data_output( $variation['variation_id'] );}}//简单的产品elseif( $product->is_type('simple')){$output .= fs_format_product_data_output( $product->get_id() );}否则返回;//出口返回 $output .= '</div>';//总是返回一个短代码}//实用功能:获取和格式化产品数据函数 fs_format_product_data_output( $the_id ){$empty = __( '(empty)', 'woocommerce');//获取 WC_Product_Variation 对象的实例$product = wc_get_product( $the_id );//仅 wc_get_price_to_display() 尊重是否要显示含税或不含税的产品$price = wc_price( wc_get_price_to_display( $product, array( 'price' => $product->get_regular_price() ) );$sale_price = wc_get_price_to_display( $product, array( 'price' => $product->get_sale_price() );$sale_price = !空($sale_price)?wc_price($sale_price) : $empty;//如果没有设置销售价格,可以使用这个类如果(!$product->is_on_sale()){$no_sale_price = 'no-sale-price';}$size = $product->get_attribute('pa_size');$size = !空($size)?get_term_by( 'slug', $size, 'pa_size' )->name : $empty;$stock_qty = $product->get_stock_quantity();$stock_qty = !空($stock_qty)?$stock_qty : '0';如果( $stock_qty <= 0 ){$stock_status = '库存售罄';}别的 {$stock_status = '库存可用';}$输出 = '<ul class="'.$stock_status .'"><li class="fs-data-price">'.$price.'一个.<li class="fs-data-size">大小:'.$size.'</li><li class="fs-data-sale'.$no_sale_price .'">'.$sale_price.'一个.优惠顾客价格<li class="fs-data-stock">库存数量:'.$stock_qty.'</li><li class="fs-data-notice">数量变化很快!</li>';返回 $output;}
尝试以下稍微更改的代码,其中每个显示的变化将按正常价格排序(从低到高):
add_shortcode("price_variation_table", "custom_available_variations_table");函数 custom_available_variations_table( $atts ) {全球 $post;//属性$atts = shortcode_atts(大批('id' =>$post->ID),$atts, 'price_variation_table');if( is_admin() ) 返回;//仅在前端$product = wc_get_product($atts['id']);//获取 WC_Product 对象$output = '<div class="fs-product-data-wrapper">';//变量产品if($product->is_type('变量')){//获取变量产品中的可用变体$available_variations = $product->get_available_variations();如果(计数($available_variations)> 0){$variations_ids = array();//第一个循环 - 在具有常规价格的数组中设置变化 Idforeach( $available_variations 作为 $variation ){$product = wc_get_product( $variation['variation_id'] );$price = wc_price( wc_get_price_to_display( $product, array( 'price' => $product->get_regular_price() ) );$variations_ids[$variation['variation_id']] = $price;}//使用价格从低到高对变体 ID 进行排序natsort($variations_ids);//第二个循环 - 显示格式化的变化数据foreach( array_keys($variations_ids) 作为 $variations_id ){$output .= format_product_data_output( $variations_id );}}}//简单的产品elseif( $product->is_type('simple')){$output .= format_product_data_output( $product->get_id() );}否则返回;//出口返回 $output .= '</div>';//总是返回一个短代码}//实用功能:获取和格式化产品数据函数 format_product_data_output( $the_id ){$empty = __( '(empty)', 'woocommerce');//获取 WC_Product_Variation 对象的实例$product = wc_get_product( $the_id );//仅 wc_get_price_to_display() 尊重是否要显示含税或不含税的产品$price = wc_price( wc_get_price_to_display( $product, array( 'price' => $product->get_regular_price() ) );$sale_price = wc_get_price_to_display( $product, array( 'price' => $product->get_sale_price() );$sale_price = !空($sale_price)?wc_price($sale_price) : $empty;$size = $product->get_attribute('pa_size');$size = !空($size)?get_term_by( 'slug', $size, 'pa_size' )->name : $empty;$no_sale_price = !$product->is_on_sale() ?'无销售价格':'';$size = $product->get_attribute('pa_size');$size = !空($size)?get_term_by( 'slug', $size, 'pa_size' )->name : $empty;$stock_qty = $product->get_stock_quantity();$stock_qty = !空($stock_qty)?$stock_qty : '0';$stock_status = $stock_qty <= 0 ?'stock-sold-out' : '库存可用';$输出 = '<ul class="'.$stock_status .'"><li class="fs-data-price">'.$price.'一个.<li class="fs-data-size">大小:'.$size.'</li><li class="fs-data-sale'.$no_sale_price .'">'.$sale_price.'一个.优惠顾客价格<li class="fs-data-stock">库存数量:'.$stock_qty.'</li><li class="fs-data-notice">数量变化很快!</li>';返回 $output;}
代码位于活动子主题(或活动主题)的 function.php 文件中.经测试有效.
Bellow I have a custom shortcode function based on this answer code that displays a block of product data for both Simple products and each variation of a Variable product. The output of the variation blocks seems to be ordered by the ID of the variation itself.
For example, this is a screenshot of the frontend output:
Which you can see matches the order of the variation IDs (from smallest to largest) screenshot:
What I would like is to sort the variations by their prices instead (NOT by their IDs) from lowest to highest. Any help is appreciated.
This is the current customized code that I have:
add_shortcode("price_variation_table", "fs_custom_available_variations_table");
function fs_custom_available_variations_table( $atts ) {
global $post;
// Attributes
$atts = shortcode_atts(
array(
'id' => $post->ID
),
$atts, 'price_variation_table'
);
if( is_admin() ) return; // Only on front end
$product = wc_get_product($atts['id']); // Get the WC_Product Object
$output = '<div class="fs-product-data-wrapper">';
// Variable products
if( $product->is_type('variable'))
{
// Get available variations in the variable product
$available_variations = $product->get_available_variations();
if( count($available_variations) > 0 ){
foreach( $available_variations as $variation )
$output .= fs_format_product_data_output( $variation['variation_id'] );
}
}
// Simple products
elseif( $product->is_type('simple'))
{
$output .= fs_format_product_data_output( $product->get_id() );
}
else return; // Exit
return $output .= '</div>'; // return always for a shortcode
}
// Utility funtion: getting and formtting product data
function fs_format_product_data_output( $the_id ){
$empty = __( '<em>(empty)</em>', 'woocommerce' );
// Get an instance of the WC_Product_Variation object
$product = wc_get_product( $the_id );
// Only wc_get_price_to_display() respect if product is to be displayed with or without including taxes
$price = wc_price( wc_get_price_to_display( $product, array( 'price' => $product->get_regular_price() ) ) );
$sale_price = wc_get_price_to_display( $product, array( 'price' => $product->get_sale_price() ) );
$sale_price = ! empty( $sale_price ) ? wc_price($sale_price) : $empty;
// can use this class is there is no sale price set
if ( ! $product->is_on_sale() ) {
$no_sale_price = ' no-sale-price';
}
$size = $product->get_attribute( 'pa_size' );
$size = ! empty( $size ) ? get_term_by( 'slug', $size, 'pa_size' )->name : $empty;
$stock_qty = $product->get_stock_quantity();
$stock_qty = ! empty( $stock_qty ) ? $stock_qty : '0';
if ( $stock_qty <= 0 ) {
$stock_status = 'stock-sold-out';
}
else {
$stock_status = 'stock-available';
}
$output = '
<ul class="'. $stock_status .'">
<li class="fs-data-price">'.$price.' ea.</li>
<li class="fs-data-size">Size: '.$size.'</li>
<li class="fs-data-sale'. $no_sale_price .'">'.$sale_price.' ea. Preferred customer price</li>
<li class="fs-data-stock">Quantity in Stock: '.$stock_qty.'</li>
<li class="fs-data-notice">Quantities change quickly!</li>
</ul>';
return $output;
}
Try the following lightly changed code, where each displayed variations will be sorted by regular price (low to high):
add_shortcode("price_variation_table", "custom_available_variations_table");
function custom_available_variations_table( $atts ) {
global $post;
// Attributes
$atts = shortcode_atts(
array(
'id' => $post->ID
),
$atts, 'price_variation_table'
);
if( is_admin() ) return; // Only on front end
$product = wc_get_product($atts['id']); // Get the WC_Product Object
$output = '<div class="fs-product-data-wrapper">';
// Variable products
if( $product->is_type('variable'))
{
// Get available variations in the variable product
$available_variations = $product->get_available_variations();
if( count($available_variations) > 0 ){
$variations_ids = array();
// First loop - set variations Ids in an array with regular prices
foreach( $available_variations as $variation ){
$product = wc_get_product( $variation['variation_id'] );
$price = wc_price( wc_get_price_to_display( $product, array( 'price' => $product->get_regular_price() ) ) );
$variations_ids[$variation['variation_id']] = $price;
}
// Sorting variation Ids using prices from lower to highest
natsort($variations_ids);
// 2nd Loop - Display formatted variation data
foreach( array_keys($variations_ids) as $variations_id ){
$output .= format_product_data_output( $variations_id );
}
}
}
// Simple products
elseif( $product->is_type('simple'))
{
$output .= format_product_data_output( $product->get_id() );
}
else return; // Exit
return $output .= '</div>'; // return always for a shortcode
}
// Utility funtion: getting and formatting product data
function format_product_data_output( $the_id ){
$empty = __( '<em>(empty)</em>', 'woocommerce' );
// Get an instance of the WC_Product_Variation object
$product = wc_get_product( $the_id );
// Only wc_get_price_to_display() respect if product is to be displayed with or without including taxes
$price = wc_price( wc_get_price_to_display( $product, array( 'price' => $product->get_regular_price() ) ) );
$sale_price = wc_get_price_to_display( $product, array( 'price' => $product->get_sale_price() ) );
$sale_price = ! empty( $sale_price ) ? wc_price($sale_price) : $empty;
$size = $product->get_attribute( 'pa_size' );
$size = ! empty( $size ) ? get_term_by( 'slug', $size, 'pa_size' )->name : $empty;
$no_sale_price = ! $product->is_on_sale() ? ' no-sale-price' : '';
$size = $product->get_attribute( 'pa_size' );
$size = ! empty( $size ) ? get_term_by( 'slug', $size, 'pa_size' )->name : $empty;
$stock_qty = $product->get_stock_quantity();
$stock_qty = ! empty( $stock_qty ) ? $stock_qty : '0';
$stock_status = $stock_qty <= 0 ? 'stock-sold-out' : 'stock-available';
$output = '
<ul class="'. $stock_status .'">
<li class="fs-data-price">'.$price.' ea.</li>
<li class="fs-data-size">Size: '.$size.'</li>
<li class="fs-data-sale'. $no_sale_price .'">'.$sale_price.' ea. Preferred customer price</li>
<li class="fs-data-stock">Quantity in Stock: '.$stock_qty.'</li>
<li class="fs-data-notice">Quantities change quickly!</li>
</ul>';
return $output;
}
Code goes in function.php file of your active child theme (or active theme). Tested and works.
这篇关于按价格对 Woocommerce 产品变体自定义输出进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!