我试图将运费的价格设置为0.00美元,如果已选中“结帐”字段中的复选框。
当前尝试:
function no_shipping_for_own_ups($rates,$package) { foreach ($rates as $rate) { //Set the price $rate->cost = 0; } return $rates; } function woo_add_cart_ups_y_n_fee( $cart ){ if ( ! $_POST || ( is_admin() && ! is_ajax() ) ) { return; } if ( isset( $_POST['post_data'] ) ) { parse_str( $_POST['post_data'], $post_data ); } else { $post_data = $_POST; } if (isset($post_data['billing_ups_yn'])) { add_filter( 'woocommerce_package_rates','no_shipping_for_own_ups', 99, 2 ); } } add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_ups_y_n_fee', 43, 1 );
作为$post_data['billing_ups_yn']我设置为触发时更新结帐的复选框。
$post_data['billing_ups_yn']
只需选中该复选框,然后应用过滤器即可将运费设置为0。 但是,这不起作用。
要在结帐页面上的自定义javascript事件上通过ajax更改运输方式的费用,要比有条件地更改费用或其他任何事情要复杂得多,这很安静。
为了存储ajax数据,我使用了WC_Sessions并 更改了运输方式的成本,* 只有在 您操纵运输时段数据的情况下, 才起作用 *
完整的工作代码:
// Add a Custom checkbox field for shipping options (just for testing) add_action( 'woocommerce_after_checkout_billing_form', 'custom_billing_checkbox_for_testing', 10, 1 ); function custom_billing_checkbox_for_testing( $checkout ) { $field_id = 'billing_ups_yn'; // Get the checked state if exist $billing_ups = WC()->session->get('billing_ups' ); if(empty($billing_ups)) $billing_ups = $checkout->get_value( $field_id ); // Add the custom checkout field (checkbox) woocommerce_form_field( $field_id, array( 'type' => 'checkbox', 'class' => array( 'form-row-wide' ), 'label' => __('Billing UPS'), ), $billing_ups ); } // function that gets the Ajax data add_action( 'wp_ajax_woo_get_ajax_data', 'woo_get_ajax_data' ); add_action( 'wp_ajax_nopriv_woo_get_ajax_data', 'woo_get_ajax_data' ); function woo_get_ajax_data() { if ( $_POST['billing_ups'] == '1' ){ WC()->session->set('billing_ups', '1' ); } else { WC()->session->set('billing_ups', '0' ); } echo json_encode( WC()->session->get('billing_ups' ) ); die(); // Alway at the end (to avoid server error 500) } // Conditionally changing the shipping methods costs add_filter( 'woocommerce_package_rates','conditional_custom_shipping_cost', 90, 2 ); function conditional_custom_shipping_cost( $rates, $package ) { if ( WC()->session->get('billing_ups' ) == '1' ){ foreach ( $rates as $rate_key => $rate_values ) { // Not for "Free Shipping method" (all others only) if ( 'free_shipping' !== $rate_values->method_id ) { // Set the rate cost $rates[$rate_key]->cost = 0; // Set taxes rate cost (if enabled) $taxes = array(); foreach ($rates[$rate_key]->taxes as $key => $tax) if( $rates[$rate_key]->taxes[$key] > 0 ) // set the new tax cost $taxes[$key] = 0; $rates[$rate_key]->taxes = $taxes; } } } return $rates; } // 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('billing_ups' ) == '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() { ?> <script type="text/javascript"> jQuery( function($){ // update cart on delivery location checkbox option $('#billing_ups_yn_field input').change( function () { var checked = 0; if ( $('#billing_ups_yn').is(':checked') ) checked = 1; $.ajax({ type: 'POST', url: wc_checkout_params.ajax_url, data: { 'action': 'woo_get_ajax_data', 'billing_ups': checked, }, success: function (result) { $('body').trigger('update_checkout'); console.log('response: '+result); // just for testing }, error: function(error){ console.log(error); // just for testing } }); }); }); </script> <?php }
代码进入您的活动子主题(或活动主题)的function.php文件中。
经过测试和工作。
与您的评论有关的更新:
如果希望始终在加载时始终取消选中此复选框,则将第一个功能替换为该功能:
// Add a Custom checkbox field for shipping options (just for testing) add_action( 'woocommerce_after_checkout_billing_form', 'custom_billing_checkbox_for_testing', 10, 1 ); function custom_billing_checkbox_for_testing( $checkout ) { $field_id = 'billing_ups_yn'; // Add the custom checkout field (checkbox) woocommerce_form_field( $field_id, array( 'type' => 'checkbox', 'class' => array( 'form-row-wide' ), 'label' => __('Billing UPS'), ), '' ); }