Désactiver une méthode d’expédition spécifique si le paiement contre remboursement est choisi dans Woocommerce

Je dois désactiver une méthode d’expédition spécifique si le paiement sélectionné par l’utilisateur est “Paiement à la livraison”. Le problème est que le code suivant ne fonctionne que si je réinitialise et réinitialise les transitoires WooCommerce à chaque fois. Cela ne fonctionne pas sur la sélection de l’utilisateur dans les deux sens.

add_filter( 'woocommerce_package_rates', 'alter_shipping_methods', 100 ); function alter_shipping_methods( $rates ) { $chosen_gateway = WC()->session->chosen_payment_method; // If payment is Cash on delivery remove specific shipping if($chosen_gateway == 'cod') { foreach ( $rates as $rate_id => $rate ) { if ( $rate->label === 'Hrvatska pošta' ) { unset( $rates[ $rate_id ] ); } } } return $rates; } 

J’ai ce code qui devrait déclencher et je vois la sortie dans la console lorsque je clique sur les options.

 jQuery(document.body).on('change', 'input[name="payment_method"]', function() { console.log('Payment method changed'); jQuery('body').sortinggger('update_checkout'); }); 

J’ai essayé avec ça, ça ne marche pas

 function action_woocommerce_checkout_update_order_review($array, $int) { WC()->cart->calculate_shipping(); return; } add_action('woocommerce_checkout_update_order_review', 'action_woocommerce_checkout_update_order_review', 10, 2); 

Et j’ai aussi essayé un appel AJAX personnalisé qui appelle une fonction PHP et à l’intérieur de ce filtre, aucun résultat

 add_filter( 'woocommerce_package_rates', 'alter_shipping_methods', 100 ); 

Que devrais-je essayer ensuite?

Voici la méthode de travail complète pour que le mode de paiement “COD” désactive un mode de livraison spécifique.

Vous devrez définir dans la première fonction l’id de la méthode d’expédition que vous souhaitez masquer.

Le code:

 // Conditionally show/hide shipping methods add_filter( 'woocommerce_package_rates','show_hide_shipping_methods', 90, 2 ); function show_hide_shipping_methods( $rates, $package ) { if ( WC()->session->get('hide_shipping' ) == '1' ){ // HERE below set your shipping methods IDs to be removed unset($rates['flat_rate:12']); } return $rates; } // Function that gets the Ajax data add_action( 'wp_ajax_session_hideit', 'wc_session_hide_shipping_method' ); add_action( 'wp_ajax_nopriv_session_hideit', 'wc_session_hide_shipping_method' ); function wc_session_hide_shipping_method() { if ( isset($_POST['disable_smi']) && $_POST['disable_smi'] == '1' ){ WC()->session->set('hide_shipping', '1' ); } else { WC()->session->set('hide_shipping', '0' ); } // Just for testing ==> To be removed echo json_encode( WC()->session->get('billing_ups' ) ); die(); // Alway at the end (to avoid server error 500) } // Enabling, disabling and refreshing session shipping methods data add_action( 'woocommerce_checkout_update_order_review', 'refresh_shipping_methods', 10, 1 ); function refresh_shipping_methods( $post_data ){ $bool = true; if ( WC()->session->get('hide_shipping' ) == '1' ) $bool = false; // Mandatory to make it work with shipping methods foreach ( WC()->cart->get_shipping_packages() as $package_key => $package ){ WC()->session->set( 'shipping_for_package_' . $package_key, $bool ); } WC()->cart->calculate_shipping(); } // The Jquery script add_action( 'wp_footer', 'custom_checkout_script' ); function custom_checkout_script() { if( ! is_checkout() ) return; ?>   

Le code va dans le fichier function.php de votre thème enfant actif (ou thème actif). Testé et fonctionne.

Pour pouvoir obtenir le bon ID de méthode d’expédition, vous pouvez utiliser votre inspecteur de navigateur de cette façon:

entrez la description de l'image ici