I’m using this code to get the variable product options
$terms = wc_get_product_terms( $bundle_product_id, $name, array( 'fields' => 'all' ) ); foreach ( $terms as $term ) { if ( !in_array( $term->slug, $options ) ) { continue; } echo '<option value="' . esc_attr( $term->slug ) . '" ' . selected( sanitize_title( $selected_value ), sanitize_title( $term->slug ), false ) . '>' . apply_filters( 'woocommerce_variation_option_name', $term->name ) . '</option>'; }
I tried a lot of codes to get price next to the name in dropdown menu , but nothing get right
Advertisement
Answer
It will only work if you have just one product attribute for variations set in the variable product (so only one dropdown).
If you have more than one dropdowns in your variable product, as the variations are a combination of the different product attributes values, it will not work logically.
So the following code will display the product variation price in a unique product attribute dropdown:
// Utility function to get the price of a variation from it's attribute value function get_the_variation_price_html( $product, $name, $term_slug ){ foreach ( $product->get_available_variations() as $variation ){ if($variation['attributes'][$name] == $term_slug ){ return strip_tags( $variation['price_html'] ); } } } // Add the price to the dropdown options items. add_filter( 'woocommerce_dropdown_variation_attribute_options_html', 'show_price_in_attribute_dropdown', 10, 2); function show_price_in_attribute_dropdown( $html, $args ) { // Only if there is a unique variation attribute (one dropdown) if( sizeof($args['product']->get_variation_attributes()) == 1 ) : $options = $args['options']; $product = $args['product']; $attribute = $args['attribute']; $name = $args['name'] ? $args['name'] : 'attribute_' . sanitize_title( $attribute ); $id = $args['id'] ? $args['id'] : sanitize_title( $attribute ); $class = $args['class']; $show_option_none = $args['show_option_none'] ? true : false; $show_option_none_text = $args['show_option_none'] ? $args['show_option_none'] : __( 'Choose an option', 'woocommerce' ); if ( empty( $options ) && ! empty( $product ) && ! empty( $attribute ) ) { $attributes = $product->get_variation_attributes(); $options = $attributes[ $attribute ]; } $html = '<select id="' . esc_attr( $id ) . '" class="' . esc_attr( $class ) . '" name="' . esc_attr( $name ) . '" data-attribute_name="attribute_' . esc_attr( sanitize_title( $attribute ) ) . '" data-show_option_none="' . ( $show_option_none ? 'yes' : 'no' ) . '">'; $html .= '<option value="">' . esc_html( $show_option_none_text ) . '</option>'; if ( ! empty( $options ) ) { if ( $product && taxonomy_exists( $attribute ) ) { $terms = wc_get_product_terms( $product->get_id(), $attribute, array( 'fields' => 'all' ) ); foreach ( $terms as $term ) { if ( in_array( $term->slug, $options ) ) { // Get and inserting the price $price_html = get_the_variation_price_html( $product, $name, $term->slug ); $html .= '<option value="' . esc_attr( $term->slug ) . '" ' . selected( sanitize_title( $args['selected'] ), $term->slug, false ) . '>' . esc_html( apply_filters( 'woocommerce_variation_option_name', $term->name ) . ' ::: ' . $price_html ) . '</option>'; } } } else { foreach ( $options as $option ) { $selected = sanitize_title( $args['selected'] ) === $args['selected'] ? selected( $args['selected'], sanitize_title( $option ), false ) : selected( $args['selected'], $option, false ); // Get and inserting the price $price_html = get_the_variation_price_html( $product, $name, $term->slug ); $html .= '<option value="' . esc_attr( $option ) . '" ' . $selected . '>' . esc_html( apply_filters( 'woocommerce_variation_option_name', $option ) . ' ::: ' . $price_html ) . '</option>'; } } } $html .= '</select>'; endif; return $html; }
Code goes in function.php file of your active child theme (or active theme). Tested and works.