【问题标题】:Display custom price based on custom fields for Woocommerce simple product根据 Woocommerce 简单产品的自定义字段显示自定义价格
【发布时间】:2019-04-24 02:28:06
【问题描述】:

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

Example

请帮忙。

【问题讨论】:

    标签: php wordpress woocommerce product price


    【解决方案1】:

    此代码仅处理单个产品页面上的显示价格更改,该更改基于自定义字段选择的简单产品的价格值。

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

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

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

    // 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 文件中。经过测试并且可以工作。

    【讨论】:

    • 它非常适合我,再次感谢您的帮助 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多