WedX - журнал о программировании и компьютерных науках

Отображать цены на товары/оптовые цены при регистрации, вне Woocommerce

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

Как вы можете видеть на https://www.cascinacanova.it/en/acquista-online/ здесь у меня есть стандартный магазин Woocommerce. Цены видны и при регистрации они динамически меняются: старые цены зачеркиваются, а появляется новая цена со скидкой. Это возможно благодаря оптовым ценам на WooCommerce от Wholesale Suite и этому коду, который позволяет новым пользователям регистрироваться с привилегиями оптовых клиентов:

add_role( 'wholesale_customer', __( 'Wholesale Customer' ), array(
  'read' => true, 
));
  
add_filter( 'woocommerce_new_customer_data', 'bbloomer_assign_custom_role' );
  
function bbloomer_assign_custom_role( $args ) {
  $args['role'] = 'wholesale_customer';
  return $args;
}

Вот где начинается сложная часть: в https://www.cascinacanova.it/en/i-nostri-vini/ У меня есть несколько кнопок, которые должны показывать цену, и это самая простая часть. После этого сообщения о переполнении стека я сделал следующее:

Этот шорткод на кнопке:

[product_price id="37"]

Этот код в functions.php

function custom_price_shortcode_callback( $atts ) {

    $atts = shortcode_atts( array(
        'id' => null,
    ), $atts, 'product_price' );

    $html = '';

    if( intval( $atts['id'] ) > 0 && function_exists( 'wc_get_product' ) ){
        // Get an instance of the WC_Product object
        $product = wc_get_product( intval( $atts['id'] ) );

        // Get the product prices
        $price         = wc_get_price_to_display( $product, array( 'price' => $product->get_price() ) ); // Get the active price
        $regular_price = wc_get_price_to_display( $product, array( 'price' => $product->get_regular_price() ) ); // Get the regular price
        $sale_price    = wc_get_price_to_display( $product, array( 'price' => $product->get_sale_price() ) ); // Get the sale price

        // Your price CSS styles
        $style1 = 'style="font-size:40px;color:#e79a99;font-weight:bold;"';
        $style2 = 'style="font-size:25px;color:#e79a99"';

        // Formatting price settings (for the wc_price() function)
        $args = array(
            'ex_tax_label'       => false,
            'currency'           => 'EUR',
            'decimal_separator'  => '.',
            'thousand_separator' => ' ',
            'decimals'           => 2,
            'price_format'       => '%2$s %1$s',
        );

        // Formatting html output
        if( ! empty( $sale_price ) && $sale_price != 0 && $sale_price < $regular_price )
            $html = "<del $style2>" . wc_price( $regular_price, $args ) . "</del> <ins $style1>" . wc_price( $sale_price, $args ) . "</ins>"; // Sale price is set
        else
            $html = "<ins $style1>" . wc_price( $price, $args ) . "</ins>"; // No sale price set
    }
    return $html;
 }
 add_shortcode( 'product_price', 'custom_price_shortcode_callback' );

Вот в чем проблема, потому что этот код идет и принимает обычную цену со скидкой, установленную Woocommerce, а не то, что мы называем оптовой ценой.

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

Дайте мне знать, если вам нужна дополнительная информация, и заранее спасибо за вашу помощь!

19.02.2021

Ответы:


1

Я использовал wholesale_customer_wholesale_price в качестве пользовательского метаданных цены.
Если он вызывает иначе, измените его в функции.

Если у пользователя есть роль wholesale_customer, он получит оптовую цену из метаданных wholesale_customer_wholesale_price:

  • Если значение существует и оптовая цена меньше обычной цены, будет показана оптовая цена.

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

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

add_shortcode( 'product_price', 'custom_price_shortcode_callback' );
function custom_price_shortcode_callback( $atts ) {

    $atts = shortcode_atts( array(
        'id' => null,
    ), $atts, 'product_price' );

    $html = '';

    if ( intval( $atts['id'] ) > 0 && function_exists( 'wc_get_product' ) ) {
        // Get an instance of the WC_Product object
        $product = wc_get_product( intval( $atts['id'] ) );

        // Check user role
        if ( current_user_can( 'wholesale_customer' ) ) {
            $wholesale_price = str_replace( ',', '.', $product->get_meta( 'wholesale_customer_wholesale_price', true ) );
            if ( ! empty( $wholesale_price ) && (float) $wholesale_price < (float) $product->get_regular_price() ) {
                $regular_price = wc_get_price_to_display( $product, array( 'price' => $product->get_regular_price() ) ); // Get the regular price
                $sale_price    = wc_get_price_to_display( $product, array( 'price' => $wholesale_price ) ); // Get the sale price
                $price         = wc_get_price_to_display( $product, array( 'price' => $wholesale_price ) ); // Get the active price
            } else {
                $regular_price = wc_get_price_to_display( $product, array( 'price' => $product->get_regular_price() ) ); // Get the regular price
                $sale_price    = ''; // Set the sale price
                $price         = wc_get_price_to_display( $product, array( 'price' => $product->get_regular_price() ) ); // Set the active price
            }
        } else {
            // Get the product prices
            $regular_price = wc_get_price_to_display( $product, array( 'price' => $product->get_regular_price() ) ); // Get the regular price
            $sale_price    = wc_get_price_to_display( $product, array( 'price' => $product->get_sale_price() ) ); // Get the sale price
            $price         = wc_get_price_to_display( $product, array( 'price' => $product->get_price() ) ); // Get the active price
        }
        
        // Your price CSS styles
        $style1 = 'style="font-size:40px;color:#e79a99;font-weight:bold;"';
        $style2 = 'style="font-size:25px;color:#e79a99"';

        // Formatting price settings (for the wc_price() function)
        $args = array(
            'ex_tax_label'       => false,
            'currency'           => 'EUR',
            'decimal_separator'  => '.',
            'thousand_separator' => ' ',
            'decimals'           => 2,
            'price_format'       => '%2$s&nbsp;%1$s',
        );

        // Formatting html output
        if( ! empty( $sale_price ) && $sale_price != 0 && $sale_price < $regular_price )
            $html = "<del $style2>" . wc_price( $regular_price, $args ) . "</del> <ins $style1>" . wc_price( $sale_price, $args ) . "</ins>"; // Sale price is set
        else
            $html = "<ins $style1>" . wc_price( $price, $args ) . "</ins>"; // No sale price set
    }
    return $html;
}

Код протестирован и работает.

19.02.2021
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]