Sort a Woocommerce product variations custom output by their price

后端 未结 1 1784
小鲜肉
小鲜肉 2021-01-22 15:47

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

1条回答
  •  不要未来只要你来
    2021-01-22 15:58

    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 = '
    '; // 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 .= '
    '; // return always for a shortcode } // Utility funtion: getting and formatting product data function format_product_data_output( $the_id ){ $empty = __( '(empty)', '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 = '
    • '.$price.' ea.
    • Size: '.$size.'
    • '.$sale_price.' ea. Preferred customer price
    • Quantity in Stock: '.$stock_qty.'
    • Quantities change quickly!
    '; return $output; }

    Code goes in function.php file of your active child theme (or active theme). Tested and works.

    0 讨论(0)
提交回复
热议问题