Как вывести конкретную цену вариативного товара woocommerce (цену по умолчанию), а не диапазон?
Здравствуйте! Как можно реализовать следующий момент (все по порядку):
1. есть вариативный товар, который в зависимости от изменения атрибута (цвет товара) меняет цену;
2. на странице каталога у товара под названием, соответственно, выводится диапазон цен, что не есть хорошо для поставленной задачи;
3. есть вариант (найденный на просторах сети, и заключающийся добавлением строк в functions.php) реализовать вывод цены в формате «от «минимальная цена», но это тоже не подходит для достижения нужной цели;
4. собственно вопрос: как сделать так, чтобы под товаром выводилась цена конкретной вариации, той, которая в настройках вариаций товара указана по умолчанию?
Заранее спасибо за помощь!
Выводим цену вариативного товара
// выводим цену вариативного товара add_filter('woocommerce_available_variation', function ($value, $object = null, $variation = null) { if ($value['price_html'] == '') { $value['price_html'] = '<span class="price">' . $variation->get_price_html() . '</span>'; } return $value; }, 10, 3);
Выводим цену рядом с вариацией товара
add_filter( 'woocommerce_variation_option_name', 'display_price_in_variation_option_name' ); function display_price_in_variation_option_name( $term ) { global $wpdb, $product; if ( empty( $term ) ) return $term; if ( empty( $product->id ) ) return $term; $result = $wpdb->get_col( "SELECT slug FROM {$wpdb->prefix}terms WHERE name = '$term'" ); $term_slug = ( !empty( $result ) ) ? $result[0] : $term; $query = "SELECT postmeta.post_id AS product_id FROM {$wpdb->prefix}postmeta AS postmeta LEFT JOIN {$wpdb->prefix}posts AS products ON ( products.ID = postmeta.post_id ) WHERE postmeta.meta_key LIKE 'attribute_%' AND postmeta.meta_value = '$term_slug' AND products.post_parent = $product->id"; $variation_id = $wpdb->get_col( $query ); $parent = wp_get_post_parent_id( $variation_id[0] ); if ( $parent > 0 ) { $_product = new WC_Product_Variation( $variation_id[0] ); return $term . ' (' . wp_kses( woocommerce_price( $_product->get_price() ), array() ) . ')'; } return $term; }
Если я вас правильно понял.
Забыл нажать комментарий. написал уточнения, просто как ответы)
Немного не то.
Вот пример товара. http://megapit.kz/product/optimum-nutrition-bcaa-1000-400-kapsul/
В нем по умолчанию задана вариация товара объемом 400 капсул и ценой 10,500₸
Цена над кнопкой добавить в корзину указана сразу правильная, и меняется если выбрать другую вариацию. Все как надо работает.
Вопрос в следующем. Как сделать чтобы другая цена, что выше стоит (под кратким описанием) и в самом каталоге, где много товаров выводилась именно от товара что указана в вариация по умолчанию (при создании товара и его вариаций), а не минимальная 6,800₸ как стоит сейчас на примере данного товара.
Изначально был диапазон цен, как и должно быть при создании вариаций.
От диапазона я избавился следующим кодом:
add_filter( 'woocommerce_variable_sale_price_html', 'wc_wc20_variation_price_format', 10, 2 ); add_filter( 'woocommerce_variable_price_html', 'wc_wc20_variation_price_format', 10, 2 ); function wc_wc20_variation_price_format( $price, $product ) { // ???? ??? $prices = array( $product->get_variation_price( 'min', true ), $product->get_variation_price( 'max', true ) ); $price = $prices[0] !== $prices[1] ? sprintf( __( '%1$s', 'woocommerce' ), wc_price( $prices[0] ) ) : wc_price( $prices[0] ); // ?? ? ???? $prices = array( $product->get_variation_regular_price( 'min', true ), $product->get_variation_regular_price( 'max', true ) ); sort( $prices ); $saleprice = $prices[0] !== $prices[1] ? sprintf( __( '%1$s', 'woocommerce' ), wc_price( $prices[0] ) ) : wc_price( $prices[0] ); if ( $price !== $saleprice ) { $price = '<del>' . $saleprice . '</del> <ins>' . $price . '</ins>'; } return $price; }
Уже пол дела сделано — осталась одна цена, а не диапазон цен. Но получается так что она минимальная из возможных цен по вариациям.
Надо чтобы выводилась цена от товара по умолчанию указанного в вариациях.

В этой функции сделайте var_dump($price, $product); в самом верху функции. Можете сюда прислать, дамп. Посмотрим можно ли там из чего выбрать вашу цену.
Точно такая же проблема, скажите у нее есть решение.?
add_filter('woocommerce_variable_price_html', 'custom_variation_price_default', 10, 2); add_filter('woocommerce_variable_sale_price_html', 'custom_variation_price_default', 10, 2 ); function custom_variation_price_default( $price, $product ) { foreach($product->get_available_variations() as $pav){ $def=true; foreach($product->get_variation_default_attributes() as $defkey=>$defval){ if($pav['attributes']['attribute_'.$defkey]!=$defval){ $def=false; } } if($def){ $price = $pav['display_price']; } } return woocommerce_price($price); }
решение отсюда https://stackoverflow.com/questions/32319835/woocommerce-show-default-variation-price