用产品自定义字段值替代woocommerce购物车项目价格 [英] Override woocommerce cart item price with product custom field value

查看:42
本文介绍了用产品自定义字段值替代woocommerce购物车项目价格的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在woocommerce中,我正在使用高级自定义字段",并尝试获取每个产品中的自定义字段值作为价格,而不是默认产品价格.此自定义字段称为'custom_price'.

In woocommerce I am using Advanced Custom Fields and trying to get a custom field value in each product as price instead of the default product price. this custom field is called 'custom_price'.

如何更改此硬编码值以使用它呢?

How can I change this hard coded value to use that instead?

这是我的代码:

 add_action( 'woocommerce_before_calculate_totals', 'add_custom_price' 
 );

 function add_custom_price( $cart_object ) {
     $custom_price = 10; 
     foreach ( $cart_object->cart_contents as $key => $value ) {
         $value['data']->set_price($custom_price);
     }
 }

推荐答案

更新3:这是包含所有自定义字段和购物车价格变化的完整解决方案.

Update 3: Here is the complete solution with all custom fields and the cart item price change.

您将需要添加一些jQuery代码来进行产品价格计算,在产品页面上显示计算出的价格,并将此计算出的价格设置在隐藏字段中.

You will need to add some jQuery code to make your product price calculation, display calculated price on product page and set this calculated price on a hidden field.

将产品添加到购物车后,代码将捕获计算出的价格并将其设置在相应的购物车项目中……

Once product will be added to cart, the code will catch the calculated price and will set it in the corresponding cart item…

代码:

// The product custom field - Frontend
add_action( 'woocommerce_before_add_to_cart_button', 'custom_discount_price_product_field' );
function custom_discount_price_product_field() {
    global $product;

    $curs = get_woocommerce_currency_symbol(); // Currency symbol

    // Get the discounted value (from product backend)
    $discount = (float) get_post_meta( $product->get_id(), '_price_discount', true );

    // jQuery will get the discount here for calculations
    echo '<input type="hidden" name="price_discount" value="'.$discount.'">';

    echo '<div>';

    woocommerce_form_field( 'select_price', array(
        'type'          => 'select',
        'class'         => array('my-field-class form-row-wide'),
        'label'         => __('Discount'),
        'options'     => array(
            ''      => __( 'Select your discount', 'woocommerce' ),
            '5'     => $curs . '5',
            '10'    => $curs . '10',
            '15'    => $curs . '15',
            '20'    => $curs . '20',
        ),
    ), '' );

    // This field will be used to send the calculated price
    // jQuery will set the calculated price on this field
    echo '<input type="hidden" name="custom_price" value="52">'; // 52 is a fake value for testing purpose

    echo '</div><br>';

    // BELOW your jquery code to calculate price and update "custom_price" hidden field
    ?>
    <script type="text/javascript">
    jQuery( function($){
        // Here
    });
    </script>
    <?php
}

// Add a custom field to product in backend
add_action( 'woocommerce_product_options_pricing', 'add_field_product_options_pricing' );
function add_field_product_options_pricing() {
    global $post;

    echo '<div class="options_group">';

    woocommerce_wp_text_input( array(
        'id'            => '_price_discount',
        'label'         => __('Discount price', 'woocommerce') . ' (%)',
        'placeholder'   => __('Set the Discount price…', 'woocommerce'),
        'description'   => __('Enter the custom value here.', 'woocommerce'),
        'desc_tip'      => 'true',
    ));

    echo '</div>';
}

// Save product custom field to database when submitted in Backend
add_action( 'woocommerce_process_product_meta', 'save_product_options_custom_fields', 30, 1 );
function save_product_options_custom_fields( $post_id ){
    // Saving custom field value
    if( isset( $_POST['_price_discount'] ) ){
        update_post_meta( $post_id, '_price_discount', sanitize_text_field( $_POST['_price_discount'] ) );
    }
}

// Add custom calculated price conditionally as custom data to cart items
add_filter( 'woocommerce_add_cart_item_data', 'add_custom_price_to_cart_item_data', 20, 2 );
function add_custom_price_to_cart_item_data( $cart_item_data, $product_id ){
    if( ! isset($_POST['custom_price']) )
        return $cart_item_data;

    $cart_item_data['custom_price'] = (float) sanitize_text_field( $_POST['custom_price'] );
    $cart_item_data['unique_key'] = md5( microtime() . rand() ); // Make each item unique

    return $cart_item_data;
}

// Set conditionally a custom item price
add_action('woocommerce_before_calculate_totals', 'set_cutom_cart_item_price', 20, 1);
function set_cutom_cart_item_price( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    foreach (  $cart->get_cart() as $cart_item ) {
        if ( isset( $cart_item['custom_price'] ) )
            $cart_item['data']->set_price( $cart_item['custom_price'] );
    }
}

代码进入您的活动子主题(或活动主题)的function.php文件中.经过测试并可以运行(但是您将需要使用jquery进行自己的计算)

Code goes in function.php file of your active child theme (or active theme). Tested and works (but you will need to make your own calculations with jquery)

这篇关于用产品自定义字段值替代woocommerce购物车项目价格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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