domrocc
domrocc

Reputation: 19

Is there a possibility to make custom prices?

I'm selling Gift Cards via WooCommerce on Wordpress. My customer should be able to set a value for the gift card amount by himself. I just was able to do this via a plugin. Is there a possibilty to do this by changing some code or via functions.php?

Installed Pimwick Gift Card Pro

Upvotes: 0

Views: 338

Answers (1)

Frits
Frits

Reputation: 7614

Yes, but it's a fairly complex process if doing so from a completely fresh WooCommerce installation with no additional plugins. You will need to do the following things to achieve it:

  1. Add a custom input field to the product to add the custom price
  2. Save the data from the custom input field to the session (cart) when that product is added to the cart
  3. Add the cart meta (created above in #2) to the order when the order is created
  4. Adjust the cost of the product based on the custom price meta (added above in #3).

Step 1: Add a custom input field:

You can add the input field using the woocommerce_before_add_to_cart_button filter as shown below.

Alternatively you can use the woocommerce_wp_text_input - here's an example.

add_action( 'woocommerce_before_add_to_cart_button', 'add_custom_price_input', 100 );
function add_custom_price_input() {
    if(get_the_ID() != 123) { //use the product ID of your gift card here, otherwise all products will get this additional field
        return;
    }
    echo '<input type="number" min="50" placeholder="50" name="so_57140247_price">';
}

Step 2: Save custom price to Cart/Session

Next, we need to make sure that your custom input field data is carried over to the cart/session data. We can make use of the woocommerce_add_cart_item_data ( docs | example ) filter to that:

add_filter( 'woocommerce_add_cart_item_data', 'add_custom_meta_to_cart', 10, 3 );
function add_custom_meta_to_cart( $cart_item_data, $product_id, $variation_id ) {
    $custom_price   = intval(filter_input( INPUT_POST, 'so_57140247_price' ));

    if ( !empty( $custom_price ) && $product_id == 123 ) { //check that the custom_price variable is set, and that the product is your gift card
        $cart_item_data['so_57140247_price'] = $custom_price; //this will add your custom price data to the cart item data
    }

    return $cart_item_data;
}

Step 3: Add cart meta to the order

Next we have to add the meta from the cart/session to the order itself so that it can be used in the order-total calculations. We use the woocommerce_checkout_create_order_line_item ( docs | example ) to do this:

add_action( 'woocommerce_checkout_create_order_line_item', 'add_custom_meta_to_order', 10, 4 );
function add_custom_meta_to_order( $item, $cart_item_key, $values, $order ) {
    //check if our custom meta was set on the line item of inside the cart/session
    if ( !empty( $values['so_57140247_price'] ) ) {
        $item->add_meta_data( '_custom_price', $values['so_57140247_price'] ); //add the value to order line item
    }
    return;
}

Step 4: Adjust total of gift card line item

Finally, we simply adjust the cost of the line item of the gift card based on the value entered into the input field. We can hook into woocommerce_before_calculate_totals ( docs | example ) to do this.

add_action( 'woocommerce_before_calculate_totals', 'calculate_cost_custom', 10, 1);
function calculate_cost_custom( $cart_obj ) {
    foreach ( $cart_obj->get_cart() as $key => $value ) {
        $price      = intval($value['_custom_price']);
        $value['data']->set_price( $price );
    }
}

Upvotes: 1

Related Questions