Отображение выбранной цены варианта WooCommerce в формате с коротким кодом - PullRequest
1 голос
/ 01 августа 2020

Я создал этот фрагмент кода, который отображает цену на любой странице веб-сайта, который контролируется woocommerce.

add_shortcode( 'hhs_product_price', 'hhs_woo_product_price_shortcode' );

function hhs_woo_product_price_shortcode( $atts ) {

    $atts = shortcode_atts( array(

        'id' => null

    ), $atts, 'hhs_product_price' );
 

    if ( empty( $atts[ 'id' ] ) ) {

        return '';

    }

    $product = wc_get_product( $atts['id'] );

    if ( ! $product ) {

        return '';

    }

    return $product->get_price_html();
} 

Я бы хотел изменить код, чтобы, если покупатель выбирает продукт с вариацией. Затем цена изменится, чтобы отобразить цену вариации. Например, прямо сейчас, если человек выбирает продукт, в данном случае настойку bottle, с вариацией цены, связанной с размером bottle. На странице продуктов они видят следующее: -

Продукт (настойка) $ 30 - $ 50

В раскрывающемся меню они могут выбрать вариант: 10 мг bottle (30 долларов США), 15 мг. bottle (40 долларов) или 20 мг bottle (50 долларов). Поэтому, если человек выбирает вариант 20 мг, цена должна отображать 50 долларов вместо 30 - 50 долларов

Я уже просматривал различные сообщения о stackoverflow с аналогичной проблемой, но ни одно из этих решений у меня не работает

Любая помощь будет весьма уместна.

Спасибо

1 Ответ

2 голосов
/ 02 августа 2020

Чтобы отобразить цену выбранного продукта из вариации переменных продуктов, требуется jQuery. Таким образом, следующий шорткод будет обрабатывать все типы продуктов, включая переменные продукты и их вариации цен:

add_shortcode( 'product_price', 'display_formatted_product_price' );
function display_formatted_product_price( $atts ) {
    extract(shortcode_atts( array(
        'id' => null
    ), $atts, 'product_price' ) );

    global $product;

    if( ! empty($id) || ! is_a($product, 'WC_Product') ) {
        $product = wc_get_product( empty($id) ? get_the_id() : $id );
    }

    $price_html = $product->get_price_html();

    // Others product types than variable
    if ( ! $product->is_type('variable') ) {
        return '<span class="product-price">' . $price_html . '</span>';
    }
    // For variable products
    else {
        ob_start();

        ?>
        <script type="text/javascript">
        jQuery( function($){
            var p = '<?php echo $price_html; ?>', s = 'span.product-price';

            $( 'form.variations_form.cart' ).on('show_variation', function(event, data) {
                $(s).html(data.price_html); // Display the selected variation price
            });

            $( 'form.variations_form.cart' ).on('hide_variation', function() {
                $(s).html(p); // Display the variable product price range
            });
        });
        </script>
        <?php

        return ob_get_clean() . '<span class="product-price">' . $price_html . '</span>';
    }
}

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

ИСПОЛЬЗОВАНИЕ :

Используйте [product_price] или в php код echo do_shortcode('[product_price]').

Вы также можете определить идентификатор продукта, например (например, для продукта id 37): [product_price id="37"]

...