根据 Woocommerce 简单产品的自定义字段显示自定义价格 [英] Display custom price based on custom fields for Woocommerce simple product

查看:56
本文介绍了根据 Woocommerce 简单产品的自定义字段显示自定义价格的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

PHP 代码:

add_action('woocommerce_before_add_to_cart_button', 'custom_product_field');函数 custom_product_field() {全球$产品;if( $product->is_type('variable') ) 返回;$options = 数组("" =>__('提示'),20.00" =>"Tipo 1 + 20,00",25.00" =>"Tipo 2 + 25,00",);woocommerce_form_field('amostra', array('类型' =>'选择','类' =>数组('我的字段类表单行宽'),'标签' =>__('Tipos', $domain),'必需' =>真的,'选项' =>$选项,),'');$options_ra = 数组("" =>__('Sem Modelos'),15.00" =>"模型 A + 15,00",25.00" =>"Modelo B + 25,00",);woocommerce_form_field('amostraB', 数组('类型' =>'选择','类' =>array('my-field-class_ra form-row-wide'),'标签' =>__('Modelos', $domain),'必需' =>真的,'选项' =>$options_ra,),'');$base_price = (float) wc_get_price_to_display( $product );$价格=数组('' =>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('改变', function(){$.each( a, function( key, value ){if( $(c).val() == 键 )$(b).html(value);});});});

我添加了一些自定义格式化价格功能,以便能够实现……代码如下:

//自定义格式化价格函数函数 wc_custom_price( $price, $args = array() ) {$args = apply_filters( 'wc_price_args', wp_parse_args( $args, array('ex_tax_label' =>错误的,'货币' =>'','decimal_separator' =>wc_get_price_decimal_separator(),'thousand_separator' =>wc_get_price_thousand_separator(),'小数' =>wc_get_price_decimals(),'价格格式' =>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>', '<spanclass="numeric-price">' . $price . '</span>' );$return = ''.$formatted_price .'</span>';如果 ( $args['ex_tax_label'] && wc_tax_enabled() ) {$return .= ' <small class="woocommerce-Price-taxLabel tax_label">'.WC()-> 国家/地区-> ex_tax_or_vat() .'</小>';}return apply_filters('wc_price', $return, $price, $args, $unformatted_price );}//在单个产品页面上为简单产品自定义格式化的产品价格add_filter( 'woocommerce_get_price_html', 'custom_get_price_html', 10, 2 );函数 custom_get_price_html( $price, $product ) {if( '' === $product->get_price() || $product->is_on_sale() ) {返回 $price;} elseif ( is_product() && $product->is_type('simple') ) {$price = wc_custom_price( wc_get_price_to_display( $product ) ) .$product->get_price_suffix();}返回 $price;}//在简单产品的单个产品页面上显示选定的自定义字段计算的产品价格add_action('woocommerce_before_add_to_cart_button', 'simple_product_price_custom_fields');函数 simple_product_price_custom_fields() {全球$产品;//不适用于可变产品,不适用于促销产品if( ! $product->is_type('simple') || $product->is_on_sale() )返回;$domain = 'woocommerce';woocommerce_form_field('amostra', array('类型' =>'选择','类' =>数组('我的字段类表单行宽'),'标签' =>__('Tipos', $domain),'必需' =>真的,'选项' =>大批('' =>__('Sem Tipos', $domain),'20.00' =>__('Tipo 1 + 20,00', $domain),'25.00' =>__('Tipo 2 + 25,00', $domain),)), '' );woocommerce_form_field('amostra_ra', array('类型' =>'选择','类' =>array('my-field-class_ra form-row-wide'),'标签' =>__('Modelos', $domain),'必需' =>真的,'选项' =>大批('' =>__('Sem Modelos', $domain),'15.00' =>__('Modelo A + 15,00', $domain),'25.00' =>__('Modelo B + 25,00', $domain),),), '' );$price = wc_get_price_to_display( $product );$价格=数组('' =>$价格,'20.00' =>20,'25.00' =>25,'15.00' =>15、'25.00' =>25,);//JS 代码 ?><脚本>jQuery(函数($){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('改变', function(){$.each( a, function( key, value ){if( $(f1).val() == 键 ){p1 = 键 == '' ?0:值;$(b).html( parseFloat( p + p1 + p2 ).toFixed(2) );}});});$(f2).on('改变', function(){$.each( a, function( key, value ){if( $(f2).val() == 键 ){p2 = 键 == '' ?0:值;$(b).html( parseFloat( p + p1 + p2 ).toFixed(2) );}});});});<?php}

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

In Woocommerce, I would like update base price depending on 2 selected custom fields.

With the help of LoicTheAztec I can update price of 1 custom field, so, how do a update 2 custom fields?

PHP code:

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 code:

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

Any help please.

解决方案

This code just handle the displayed price change on single product pages based on custom fields selected values for simple products which price is not on sale.

This is a bit much more complicated as the 2 select fields can interact on the calculated price at the same time and of because this case, this need to be handled differently.

The code will not change the cart item price, as more code is needed for that.

I have added some custom formatting price functions, to be able to achieve that… Here is the code:

// 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
}

Code goes in function.php file of your active child theme (or active theme). Tested and works.

这篇关于根据 Woocommerce 简单产品的自定义字段显示自定义价格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆