Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Change product price in Cart by custom field, Woocommerce

I'm currently in a problem where I have to add option in Cart with checkbox (for each item in Cart) which will change item's price with one from custom attribute.

This is an illustration of it (I have already created custom field, just need price updating function when button "Update cart" is clicked)

enter image description here

Code for displaying checkbox for each item (/woocommerce/templates/cart/cart.php):

<td class="product-url">
    <?php
        $html = sprintf( '<div class="lorem"><input type="checkbox" name="cart[%s][lorem]" value="%s" size="4"  class="input-text url text" /> Lorem price</div>', $cart_item_key, esc_attr( $values['url'] ) );
        echo $html;
    ?> 
</td>
like image 318
harisdev Avatar asked Nov 08 '22 09:11

harisdev


1 Answers

Here I'm assuming that lorem price is stored in custom meta field associated with meta_key your_custom_meta_field

Use following code in your theme's function.php file

add_action( 'woocommerce_before_calculate_totals', 'my_custom_calculate_totals' );
function my_custom_calculate_totals( $cart ) {
    if ( ! empty( $cart->cart_contents ) ) {
        $lorem_price = array();
        if ( ! empty( $_REQUEST['cart'] ) ) {      // check if any of the checkboxes is checked
            WC()->session->set( 'my_lorem_price', $_REQUEST['cart'] );      // set all checkboxes information in session
            $lorem_price = $_REQUEST['cart'];
        }
        if ( empty( $lorem_price ) ) {
            $lorem_price = WC()->session->get( 'my_lorem_price' );      // fetch all checkboxes information from session
        }
        if ( empty( $lorem_price ) ) {
            return;     // don't do anything if any of the checkboxes is not checked
        }
        foreach ( $cart->cart_contents as $cart_item_key => $cart_item ) {
            if ( isset( $lorem_price[ $cart_item_key ]['lorem'] ) ) {
                // Use following line if lorem price is set at variation level
                $id = ( ! empty( $cart_item['variation_id'] ) && $cart_item['variation_id'] > 0 ) ? $cart_item['variation_id'] : $cart_item['product_id'];
                // Use following line if lorem price is set at product level
                // $id = $cart_item['product_id'];
                $new_price = get_post_meta( $id, 'your_custom_meta_field', true );      // fetch price from custom field
                $cart_item['data']->price = $new_price;
            }
        }
    }
}
like image 168
Ratnakar - StoreApps Avatar answered Nov 14 '22 23:11

Ratnakar - StoreApps