Минимальная цена в настраиваемом формате, включая налог, для указанного c Переменного продукта WooCommerce - PullRequest
1 голос
/ 09 июля 2020

Я пытаюсь изменить цену на конкретный продукт c, чтобы он отображал цену с НДС (в отличие от других продуктов, где цена указана без НДС)

Мне удалось заставить это работать с самими переменными продуктами, используя следующий код из https://tomjesch.com/display-woocommerce-products-with-and-without-tax/

function edit_selected_variation_price( $data, $product, $variation ) {
    if(is_singular('product') && $product->get_id() == 68719 ) {
    $price = $variation->price;
    $price_incl_tax = $price + round($price * ( 20 / 100 ), 2);  
    $price_incl_tax = number_format($price_incl_tax, 2, ",", ".");
    $price = number_format($price, 2, ",", ".");
        $display_price = '<span class="price">';
        $display_price .= '<span class="amount">£ ' . $price_incl_tax .'<small class="woocommerce-price-suffix"> incl VAT</small></span>';
        $display_price .= '</span>';
    $data['price_html'] = $display_price;
    }
    return $data;
}
add_filter( 'woocommerce_available_variation', 'edit_selected_variation_price', 10, 3);

Это работает, когда выбран параметр. Однако до того, как вариант будет выбран, есть цена, которая гласит FROM: £ xxx, которую я теперь также хочу изменить, чтобы сказать «FROM: £ xxx in c VAT»

Однако я не могу кажется, делают что-нибудь, чтобы это изменить. Итак, я добавил следующее, чтобы настроить html по цене:

function cw_change_product_html( $price_html, $product ) {
 if ( $product->get_id() == 68719 ) {
     $price_incl_tax = $product->price + round($price * ( 20 / 100 ), 2);  
    $price_incl_tax = number_format($price_incl_tax, 2, ",", ".");
 $price_html = '<span class="amount">From ' . $price_incl_tax . 'incl VAT</span>';
 }
 echo $price_html;
}

А затем я попытался использовать эти три разных крючка.

add_filter( 'woocommerce_get_price_html_from_to', 'cw_change_product_html', 10, 2 );
add_filter( 'woocommerce_get_price_html', 'cw_change_product_html', 10, 2 );
add_filter('woocommerce_variable_price_html', 'cw_change_product_html', 10, 2);

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

Нужно ли мне использовать другой крючок или есть способ запустить приведенный выше код один раз?

Ответы [ 2 ]

1 голос
/ 09 июля 2020

В вашем коде есть ошибки. woocommerce_variable_price_html - лучший крючок для использования. Также вместо использования настраиваемых налоговых расчетов вы можете использовать методы WC_Tax для динамического получения суммы налога. Наконец, wc_price() - это функция форматированной цены, которая будет использоваться в WooCommerce.

Код:

add_filter( 'woocommerce_variable_price_html', 'filter_wc_variable_price_html', 10, 2 );
function filter_wc_variable_price_html( $price_html, $product ) {
    // only for variable product 68719
    if( $product->get_id() != 68719 )
        return $price_html;

    $min_price = $product->get_variation_price( 'min' );
    $tax_rates = WC_Tax::get_rates( $product->get_tax_class() );
    $taxes     = WC_Tax::calc_tax( $min_price, $tax_rates, false );

    return sprintf(
        __( 'From %s %s', 'woocommerce' ),
        wc_price( $min_price + array_sum( $taxes ) ),
        '<small class="woocommerce-price-suffix">' . __( 'incl VAT', 'woocommerce' ) . '</small>'
    );
}

Поскольку ваш другой код немного устарел и сложен, вы можете попробовать следующее: :

add_filter( 'woocommerce_available_variation', 'filter_wc_available_variation_price_html', 10, 3);
function filter_wc_available_variation_price_html( $data, $product, $variation ) {
    // only for variable product 68719
    if( $product->get_id() != 68719 )
        return $data;

    $price     = $data['display_price'];
    $tax_rates = WC_Tax::get_rates( $variation->get_tax_class() );
    $taxes     = WC_Tax::calc_tax( $price, $tax_rates, false );

    $data['price_html'] = sprintf( '%s %s',
        wc_price( $price + array_sum( $taxes ) ),
        '<small class="woocommerce-price-suffix">' . __( 'incl VAT', 'woocommerce' ) . '</small>'
    );

    return $data;
}

Код переходит в функцию. php файл вашей активной дочерней темы (или активной темы). Проверено и работает.

1 голос
/ 09 июля 2020

Вы вызываете правую ловушку (woocommerce_get_price_html), но в вашем коде есть несколько fl aws.

  1. Давайте решим вашу проблему запуска кода только по цене отображать вверху. Убедитесь, что идентификатор, который вы проверяете, является родительским.

  2. Не обращайтесь к значениям объекта продукта напрямую. WooCommerce предоставляет функции получения большого количества данных. Поэтому вместо этого используйте $product->get_price().

  3. У вас есть неопределенная переменная $price, которая будет sh взломать ваш код.

  4. Вы можете получить процентную ставку налога для родительского продукта, вместо того, чтобы жестко кодировать его в расчетах в вашей функции.

  5. Вы можете использовать функцию wc_price() для вывода форматированной цены.

Окончательный код должен выглядеть примерно так:

add_filter( 'woocommerce_get_price_html', 'cw_change_product_html', 10, 2 );
function cw_change_product_html( $price_html, $product ) {

     if ( $product->get_id() == 68719 ) {
        $tax_rates = WC_Tax::get_rates( $product->get_tax_class() );

        //Check the product tax rate of parent
        if ( !empty( $tax_rates ) ) {
            $tax_rate = reset($tax_rates);
            $price_incl_tax =  $product->get_price() + ( $product->get_price() * $tax_rate['rate'] / 100 );
            $price_html = sprintf( 'From %s incl VAT', wc_price( $price_incl_tax, array( 'currency' => get_woocommerce_currency() ) ) );
        }
     
    }
    
    return $price_html;
}
...