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

时间:2018-11-21 13:43:15

标签: php wordpress woocommerce product price

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

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

PHP代码:

brew install postgresql

JS代码:

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),
    );
}

Example

请帮忙。

1 个答案:

答案 0 :(得分: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文件中。经过测试,可以正常工作。