Updated - Handling multiple not allowed destinations…
First, for testing I here is a hooked function that displays a custom checkout select field with few options:
// Just for testing
add_action( 'woocommerce_after_checkout_billing_form', 'custom_select_field_after_checkout_billing_form', 10, 1 );
function custom_select_field_after_checkout_billing_form ( $checkout ) {
woocommerce_form_field( 'wc_billing_field_7378', array(
'type' => 'select',
'label' => __( "Destinations (custom select field)"),
'class' => array( 'form-row-wide' ),
'options' => array(
'' => __("Choose a destination"),
'naeem' => __("Naeem"),
'saad-al-abdullah' => __("Saad Al Abdullah"),
'other-one' => __("Other one"),
'last-one' => __("Last one"),
),
'required' => true,
), $checkout->get_value( 'wc_billing_field_7378' ) );
}
See below the display:
Now to get this working jQuery and Ajax are required, to be able to make "Cod" payment enabled or disabled depending on the selected option value from this custom checkout select field.
With this code when "Naeem" or "Other one" are be selected, it will hide "Cash on delivery" (cod) payment method... If another option is selected, "Cash on delivery" will be visible again.
Here is this code:
// Jquery script that send the Ajax request
add_action( 'wp_footer', 'custom_checkout_js_script' );
function custom_checkout_js_script() {
// Only on checkout
if( is_checkout() && ! is_wc_endpoint_url() ) :
?>
<script type="text/javascript">
jQuery(function($){
if (typeof wc_checkout_params === 'undefined')
return false;
var field = 'select[name="wc_billing_field_7378"]';
$( 'form.checkout' ).on('change blur', field, function() {
$.ajax({
type: 'POST',
url: wc_checkout_params.ajax_url,
data: {
'action': 'checkout_chosen_destination',
'chosen_destination': $(this).val(),
},
success: function (result) {
$(document.body).trigger('update_checkout');
console.log(result); // For testing only
},
});
});
});
</script>
<?php
endif;
}
// The Wordpress Ajax PHP receiver
add_action( 'wp_ajax_checkout_chosen_destination', 'get_ajax_checkout_chosen_destination' );
add_action( 'wp_ajax_nopriv_checkout_chosen_destination', 'get_ajax_checkout_chosen_destination' );
function get_ajax_checkout_chosen_destination() {
// Checking that the posted email is valid
if ( isset($_POST['chosen_destination']) ) {
// Set the value in a custom Woocommerce session identifier
WC()->session->set('chosen_destination', esc_attr($_POST['chosen_destination']) );
// Return the session value to jQuery
echo json_encode(WC()->session->get('chosen_destination')); // For testing only
}
die(); // always use die at the end
}
// Show/Hide payment gateways
add_filter('woocommerce_available_payment_gateways', 'show_hide_cod_payment_method', 10, 1 );
function show_hide_cod_payment_method( $available_gateways ) {
// HERE below set the not allowed destinations in the array
$not_allowed_destinations = array('naeem', 'other-one');
if ( in_array( WC()->session->get('chosen_destination'), $not_allowed_destinations ) ) {
unset($available_gateways['cod']);
}
return $available_gateways;
}
Code goes in function.php file of your active child theme (or active theme). Tested and works.