Woocommerce: показать цену вариации по умолчанию в списке товаров?

30 окт. 2017 г., 11:41:14
Просмотры: 24.2K
Голосов: 3

Есть ли способ принудительно показывать цену вариации товара, которую я установил как по умолчанию в настройках страницы товара, вместо отображения минимальной и максимальной цены?

У меня есть этот код для отображения только одной цены, но показываемая цена не является ценой вариации по умолчанию:

/*******************************
    ПОКАЗЫВАТЬ ТОЛЬКО ОДНУ ЦЕНУ ДЛЯ ВАРИАЦИЙ
*********************************/

add_filter('woocommerce_variable_price_html', 'custom_variation_price', 10, 2);
function custom_variation_price( $price, $product ) {
     $price = '';
     $price .= woocommerce_price($product->get_price());
     return $price;
}

скриншот настроек вариативного товара в WooCommerce

2
Комментарии

Возможно, дубликат вопроса https://stackoverflow.com/questions/43279746/woocommerce-show-only-one-price-for-variable-product-on-discount

Drupalizeme Drupalizeme
2 нояб. 2017 г. 11:40:05

Нет, потому что в той функции вместо вариации по умолчанию отображается самая низкая/дисконтная цена. Хотя это дубликат этого вопроса: https://stackoverflow.com/questions/36453795/obtaining-default-variation-price-on-a-variation-product-woocommerce Я проверил это, и это работает. Я подозреваю, что автор вопроса использовал это как отправную точку (такое же название функции и передаваемые переменные), но не уверен, почему этого оказалось недостаточно.

galingong galingong
2 нояб. 2017 г. 13:55:37
Все ответы на вопрос 5
1

Попробуйте этот код:

add_filter('woocommerce_variable_price_html', 'custom_variation_price', 10, 2);
function custom_variation_price( $price, $product ) {
    $available_variations = $product->get_available_variations();
    $selectedPrice = '';
    $dump = '';

    foreach ( $available_variations as $variation )
    {
        // $dump = $dump . '<pre>' . var_export($variation['attributes'], true) . '</pre>';

        $isDefVariation=false;
        foreach($product->get_default_attributes() as $key=>$val){
            // $dump = $dump . '<pre>' . var_export($key, true) . '</pre>';
            // $dump = $dump . '<pre>' . var_export($val, true) . '</pre>';
            if($variation['attributes']['attribute_'.$key]==$val){
                $isDefVariation=true;
            }   
        }
        if($isDefVariation){
            $price = $variation['display_price'];         
        }
    }
    $selectedPrice = wc_price($price);

//  $dump = $dump . '<pre>' . var_export($available_variations, true) . '</pre>';

    return $selectedPrice . $dump;
}
3 нояб. 2017 г. 12:18:19
Комментарии

Спасибо за ваш код, но я думаю, что ваш код работает только для одной вариации. Я обновил код и добавил его в сообщении ниже

Abhinav bhardwaj Abhinav bhardwaj
31 июл. 2019 г. 21:41:16
0

Это решение для установки минимальной цены по умолчанию для вариативных товаров:

add_filter('woocommerce_variable_price_html','shop_variable_product_price', 10, 2 );

function shop_variable_product_price( $price, $product ){
    // Получаем минимальную обычную цену вариации
    $variation_min_reg_price = $product->get_variation_regular_price('min', true);

    if(!empty($variation_min_reg_price)) {
        // Если есть минимальная цена вариации, используем её
        $price = woocommerce_price( $variation_min_reg_price );
    }
    else {
        // Иначе используем обычную цену товара
        $price = woocommerce_price( $product->regular_price );
    }

    return $price;
}
2 нояб. 2017 г. 15:16:36
1

Обновление кода @Abhinav для отображения минимальной цены, если значение по умолчанию не установлено:

/**
 * Показывает цену варианта по умолчанию
 * Если вариант по умолчанию отсутствует, показывает минимальную цену
 */

add_filter('woocommerce_variable_price_html', 'custom_variation_price', 10, 2);
function custom_variation_price($price, $product) {
    $available_variations = $product->get_available_variations();
    $selectedPrice = '';
    $dump = '';
    $defaultArray = array();
    foreach ($product->get_default_attributes() as $key => $val) {
        // $dump = $dump . '<pre>' . var_export($key, true) . '</pre>';
        // $dump = $dump . '<pre>' . var_export($val, true) . '</pre>';
        $defaultArray['attribute_' . $key] = $val;
    }
    // $dump = $dump . '<pre>' . var_export($defaultArray, true) . '</pre>';
    if (empty($defaultArray)) {
        $price = $product->get_variation_price( 'min', true ); // если вариант по умолчанию отсутствует, показываем минимальную цену
    } else {
        foreach ($available_variations as $variation) {
            // $dump = $dump . '<pre>' . var_export($variation['attributes'], true) . '</pre>';
            $isDefVariation = false;
    
            $result = array_diff($defaultArray, $variation['attributes']);
            if (empty($result)) {
                $isDefVariation = true;
                $price = $variation['display_price'];
                break;
            }
        }
    }

    $selectedPrice = wc_price($price);
    // $dump = $dump . '<pre>' . var_export($available_variations, true) . '</pre>';
    return $selectedPrice . $dump;
}
10 апр. 2021 г. 13:43:53
Комментарии

Какие именно изменения вы внесли и почему? Пожалуйста, [отредактируйте] ваш ответ и добавьте некоторые пояснения.

fuxia fuxia
11 апр. 2021 г. 15:00:31
0

Показать единую цену для вариативного товара

add_filter( 'woocommerce_show_variation_price', '__return_true' );
22 апр. 2019 г. 12:13:05
0

обновление кода @vivek, так как его код работает только для одной вариации

    add_filter('woocommerce_variable_price_html', 'custom_variation_price', 10, 2);
function custom_variation_price($price, $product) {
    $available_variations = $product->get_available_variations();
    $selectedPrice = '';
    $dump = '';
    $defaultArray = array();
    foreach ($available_variations as $variation) {
    // $dump = $dump . '<pre>' . var_export($variation['attributes'], true) . '</pre>';
    $isDefVariation = false;
    foreach ($product->get_default_attributes() as $key => $val) {
        // $dump = $dump . '<pre>' . var_export($key, true) . '</pre>';
            // $dump = $dump . '<pre>' . var_export($val, true) . '</pre>';
        $defaultArray['attribute_' . $key] = $val;
    }
    **$result = array_diff($defaultArray, $variation['attributes']);**
    **if (empty($result)) {
        $isDefVariation = true;
        $price = $variation['display_price'];
    }**
    }

    $selectedPrice = wc_price($price);
//  $dump = $dump . '<pre>' . var_export($available_variations, true) . '</pre>';
    return $selectedPrice . $dump;
}

Этот код будет работать для нескольких ключей вариаций

31 июл. 2019 г. 21:39:58