Reputation: 43
I am trying to disable the paypal payment gateway when the company name is added on a new order but for some reason my code isn't working. Can somebody help me out?
// Disable gateway if company name is filled in
function payment_gateway_disable_paypal( $available_gateways ) {
global $woocommerce;
if ( isset( $available_gateways['paypal'] ) && $woocommerce->customer->get_billing_company() == "" ) {
unset( $available_gateways['paypal'] );
}
return $available_gateways;
}
add_filter( 'woocommerce_available_payment_gateways', 'payment_gateway_disable_paypal' );
Upvotes: 2
Views: 469
Reputation: 253968
Use the following to disable specific payment method when specific checkout field is filled by user on checkout page:
// Jquery script that send the Ajax request
add_action( 'woocommerce_after_checkout_form', 'custom_checkout_js_script' );
function custom_checkout_js_script() {
$field_key = 'billing_company'; // Here set the targeted field
WC()->session->__unset('field_'.$field_key);
?>
<script type="text/javascript">
jQuery(function($){
if (typeof wc_checkout_params === 'undefined')
return false;
var field = '[name="<?php echo $field_key; ?>"]';
$( 'form.checkout' ).on('input change', field, function() {
$.ajax({
type: 'POST',
url: wc_checkout_params.ajax_url,
data: {
'action': 'targeted_checkout_field_change',
'field_key': '<?php echo $field_key; ?>',
'field_value': $(this).val(),
},
success: function (result) {
$(document.body).trigger('update_checkout');
console.log(result); // For testing only
},
});
});
});
</script>
<?php
}
// The Wordpress Ajax PHP receiver
add_action( 'wp_ajax_targeted_checkout_field_change', 'get_ajax_targeted_checkout_field_change' );
add_action( 'wp_ajax_nopriv_targeted_checkout_field_change', 'get_ajax_targeted_checkout_field_change' );
function get_ajax_targeted_checkout_field_change() {
// Checking that the posted email is valid
if ( isset($_POST['field_key']) && isset($_POST['field_value']) ) {
// Set the value in a custom Woocommerce session
WC()->session->set('field_'. esc_attr($_POST['field_key']), esc_attr($_POST['field_value']) );
// Return the session value to jQuery
echo json_encode(WC()->session->get('field_'. esc_attr($_POST['field_key']))); // For testing only
}
wp_die(); // always use die at the end
}
// Disable specific payment method if specif checkout field is set
add_filter( 'woocommerce_available_payment_gateways', 'payment_gateway_disable_paypal' );
function payment_gateway_disable_paypal( $available_gateways ) {
if( is_admin() )
return $available_gateways;
$payment_id = 'paypal'; // Here define the payment Id to disable
$field_key = 'billing_company'; // Here set the targeted field
$field_value = WC()->session->get('field_'.$field_key);
if ( isset($available_gateways[$payment_id]) && ! empty($field_value) ) {
unset( $available_gateways[$payment_id] );
}
return $available_gateways;
}
Code goes in functions.php file of the active child theme (or active theme). Tested and works.
Upvotes: 2