I am trying to implement warranty option into woocommerce checkout. The below code works for static price values.
// Part 1 - Display Radio Buttons
add_action( 'woocommerce_review_order_before_payment', 'custom_checkout_radio_choice' );
function custom_checkout_radio_choice() {
$chosen = WC()->session->get( 'radio_chosen' );
$chosen = empty( $chosen ) ? WC()->checkout->get_value( 'radio_choice' ) : $chosen;
$chosen = empty( $chosen ) ? '0' : $chosen;
$args = array(
'type' => 'radio',
'class' => array( 'form-row-wide', 'update_totals_on_change' ),
'options' => array(
'0' => '1 Year Repair or Replace Warranty - Included',
'75' => '2 Years Extended Warranty ($75.00)',
'112.5' => '3 Years Extended Warranty ($112.50)',
),
'default' => $chosen
);
echo '<div id="checkout-radio">';
echo '<h4>Choose your Warranty</h4>';
woocommerce_form_field( 'radio_choice', $args, $chosen );
echo '</div><br>';
}
// Part 2 - Add Fee and Calculate Total
add_action( 'woocommerce_cart_calculate_fees', 'custom_checkout_radio_choice_fee', 20, 1 );
function custom_checkout_radio_choice_fee( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
$radio = WC()->session->get( 'radio_chosen' );
if ( $radio ) {
$cart->add_fee( 'Warranty Option', $radio );
}
}
// Part 3 - Add Radio Choice to Session
add_action( 'woocommerce_checkout_update_order_review', 'custom_checkout_radio_choice_set_session' );
function custom_checkout_radio_choice_set_session( $posted_data ) {
parse_str( $posted_data, $output );
if ( isset( $output['radio_choice'] ) ){
WC()->session->set( 'radio_chosen', $output['radio_choice'] );
}
}
Is there a way to output the calculated warranty amount options based on the percentage of items Subtotal Amount? Like:
- 2 years warranty price is 10% of the Subtotal Price.
- 3 year warranty is 15%. Example:
For example if the Subtotal is $85, warranty options to display would be:
- 2 Years Extended Warranty ($8.50) /* 10% */
- 3 Years Extended Warranty ($12.75) /* 15% */
OPTIONAL: I'm also trying to use this feature to a particular product or a set of products and not to all products. If there's a way to set this.