根据 Woocommerce 简单产品的自定义字段显示自定义价格

问题描述 投票:0回答:1

在 Woocommerce 中,我想根据 2 个选定的自定义字段更新基本价格。

在 LoicTheAztec 的帮助下,我可以更新 1 个自定义字段的价格,那么,如何更新 2 个自定义字段?

PHP代码:

add_action( 'woocommerce_before_add_to_cart_button', 'custom_product_field' );
function custom_product_field() {
    global $product;
    if( $product->is_type('variable') ) return; 
    $options = array(
    ""          => __('Tipos'),
    "20.00" => "Tipo 1 + 20,00",
    "25.00" => "Tipo 2 + 25,00",
    );
    woocommerce_form_field('amostra', array(
    'type'          => 'select',
    'class'         => array('my-field-class form-row-wide'),
    'label'         => __('Tipos', $domain),
    'required'      => true,
    'options'       => $options,
    ),'');
    $options_ra = array(
    ""          => __('Sem Modelos'),
    "15.00" => "Modelo A + 15,00",
    "25.00" => "Modelo B + 25,00",
    );
    woocommerce_form_field('amostraB', array(
    'type'          => 'select',
    'class'         => array('my-field-class_ra form-row-wide'),
    'label'         => __('Modelos', $domain),
    'required'      => true,
    'options'       => $options_ra,
    ),'');
    $base_price = (float) wc_get_price_to_display( $product );
    $prices = array(
    ''      => wc_price($base_price),
    '20.00' => wc_price($base_price + 20),
    '25.00' => wc_price($base_price + 25),
    '15.00' => wc_price($base_price + 15),
    '25.00' => wc_price($base_price + 25),
    );
}

JS代码:

jQuery(function($){
    var a = <?php echo json_encode($prices); ?>,
        b = 'p.price',
        c = 'select[name="amostra"]';

    $(c).on( 'change', function(){
        $.each( a, function( key, value ){
            if( $(c).val() == key )
                $(b).html(value);
        });
    });
});

示例

请帮忙。

php jquery wordpress woocommerce product-price
1个回答
1
投票

此代码仅根据自定义字段为价格不促销的简单产品选择的值来处理单个产品页面上的显示价格更改。

这有点复杂,因为 2 个选择字段可以同时对计算的价格进行交互,并且因为这种情况,需要以不同的方式处理。

代码不会更改购物车商品价格,因为需要更多代码。

enter image description here

我添加了一些自定义格式化价格函数,以便能够实现这一点......这是代码:

// Custom formatting price function
function wc_custom_price( $price, $args = array() ) {
    $args = apply_filters( 'wc_price_args', wp_parse_args( $args, array(
        'ex_tax_label'       => false,
        'currency'           => '',
        'decimal_separator'  => wc_get_price_decimal_separator(),
        'thousand_separator' => wc_get_price_thousand_separator(),
        'decimals'           => wc_get_price_decimals(),
        'price_format'       => get_woocommerce_price_format(),
    ) ) );

    $unformatted_price = $price;
    $negative          = $price < 0;
    $price             = apply_filters( 'raw_woocommerce_price', floatval( $negative ? $price * -1 : $price ) );
    $price             = apply_filters( 'formatted_woocommerce_price', number_format( $price, $args['decimals'], $args['decimal_separator'], $args['thousand_separator'] ), $price, $args['decimals'], $args['decimal_separator'], $args['thousand_separator'] );

    if ( apply_filters( 'woocommerce_price_trim_zeros', false ) && $args['decimals'] > 0 ) {
        $price = wc_trim_zeros( $price );
    }

    $formatted_price = ( $negative ? '-' : '' ) . sprintf( $args['price_format'], '<span class="woocommerce-Price-currencySymbol">' . get_woocommerce_currency_symbol( $args['currency'] ) . '</span>', '<span class="numeric-price">' . $price . '</span>' );
    $return          = '<span class="woocommerce-Price-amount amount">' . $formatted_price . '</span>';

    if ( $args['ex_tax_label'] && wc_tax_enabled() ) {
        $return .= ' <small class="woocommerce-Price-taxLabel tax_label">' . WC()->countries->ex_tax_or_vat() . '</small>';
    }
    return apply_filters( 'wc_price', $return, $price, $args, $unformatted_price );
}

// Custom formated product price on single product pages for simple products
add_filter( 'woocommerce_get_price_html', 'custom_get_price_html', 10, 2 );
function custom_get_price_html( $price, $product ) {
    if( '' === $product->get_price() || $product->is_on_sale() ) {
        return $price;
    } elseif ( is_product() && $product->is_type('simple') ) {
        $price = wc_custom_price( wc_get_price_to_display( $product ) ) . $product->get_price_suffix();
    }
    return $price;
}

// Displaying selected custom fields calculated product price on single product pages for simple products
add_action( 'woocommerce_before_add_to_cart_button', 'simple_product_price_custom_fields' );
function simple_product_price_custom_fields() {
    global $product;

    // Not for variable products and Not for products on sale
    if( ! $product->is_type('simple') || $product->is_on_sale() )
        return;

    $domain = 'woocommerce';

    woocommerce_form_field('amostra', array(
        'type'     => 'select',
        'class'    => array('my-field-class form-row-wide'),
        'label'    => __('Tipos', $domain),
        'required' => true,
        'options'  => array(
            ''      => __('Sem Tipos', $domain),
            '20.00' => __('Tipo 1 + 20,00', $domain),
            '25.00' => __('Tipo 2 + 25,00', $domain),
        )
    ), '' );

    woocommerce_form_field('amostra_ra', array(
        'type'     => 'select',
        'class'    => array('my-field-class_ra form-row-wide'),
        'label'    => __('Modelos', $domain),
        'required' => true,
        'options'  => array(
            ''      => __('Sem Modelos', $domain),
            '15.00' => __('Modelo A + 15,00', $domain),
            '25.00' => __('Modelo B + 25,00', $domain),
        ),
    ), '' );

    $price = wc_get_price_to_display( $product );

    $prices = array(
        ''      => $price,
        '20.00' => 20,
        '25.00' => 25,
        '15.00' => 15,
        '25.00' => 25,
    );

    // JS code ?>
    <script>
    jQuery(function($){
        var a  = <?php echo json_encode($prices); ?>,
            b  = 'p.price .numeric-price',
            f1 = 'select[name="amostra"]',
            f2 = 'select[name="amostra_ra"]',
            p  = <?php echo $price; ?>,
            p1 = 0, p2 = 0;

        $(f1).on( 'change', function(){
            $.each( a, function( key, value ){
                if( $(f1).val() == key ){
                    p1 = key == '' ? 0 : value;
                    $(b).html( parseFloat( p + p1 + p2 ).toFixed(2) );
                }
            });
        });

        $(f2).on( 'change', function(){
            $.each( a, function( key, value ){
                if( $(f2).val() == key ){
                    p2 = key == '' ? 0 : value;
                    $(b).html( parseFloat( p + p1 + p2 ).toFixed(2) );
                }
            });
        });
    });
    </script>
    <?php
}

代码位于活动子主题(或活动主题)的 function.php 文件中。已测试并有效。

© www.soinside.com 2019 - 2024. All rights reserved.