購物車有需求門市不用運費,宅配未滿3000元要付運作,填寫門市時可以自動填上地址,作法如下
運費ID 3757,自行產出後置換 PS.此作法在woocommerce的購物車運費系統設定直接用0元,運費由程式去判斷再加入運費(商品)
範例中用2個門市做案例
當選定宅配後,付款方式也會自動調整成信用下或其他(非預設的自取現金)
// 在結帳頁地址欄位之前添加自取選項 add_action( 'woocommerce_before_checkout_billing_form', 'add_factory_pickup_radio_buttons_to_checkout' ); function add_factory_pickup_radio_buttons_to_checkout() { $session_value = WC()->session->get('pickup_option'); // 獲取 session 中的值 // 添加選項 echo '<div style="margin-bottom: 20px;">'; echo '<label>'; echo '<input type="radio" name="pickup_option" value="factory" ' . checked( $session_value, 'factory', false ) . '> 門市1自取'; echo '</label><br>'; echo '<label>'; echo '<input type="radio" name="pickup_option" value="store" ' . checked( $session_value, 'store', false ) . '> 門市2自取'; echo '</label><br>'; echo '<label>'; echo '<input type="radio" name="pickup_option" value="delivery" ' . checked( $session_value, 'delivery', false ) . '> 宅配'; echo '</label>'; echo '</div>'; // 添加 jQuery 來監聽選項的變動,並確保觸發 AJAX 和自動填入備註 ?> <script type="text/javascript"> jQuery(document).ready(function($) { // 監聽選項的變動 $(document).on('change', 'input[name="pickup_option"]', function() { var selectedOption = $('input[name="pickup_option"]:checked').val(); var commentText = ''; // 根據選擇的自取方式填寫備註 if (selectedOption === 'factory') { commentText = '選擇了工廠自取'; } else if (selectedOption === 'store') { commentText = '選擇了新美街門市自取'; } else if (selectedOption === 'delivery') { commentText = '選擇了宅配'; } // 填入備註欄位 $('#order_comments').val(commentText); // 發起 AJAX 請求來更新購物車和 session 狀態 $.ajax({ type: 'POST', url: '<?php echo admin_url('admin-ajax.php'); ?>', data: { action: 'handle_pickup_option', selected_option: selectedOption }, success: function(response) { // 更新購物車摘要或其他元素,而不重新加載整個頁面 $(document.body).trigger('update_checkout'); }, error: function(xhr, status, error) { console.log('AJAX Error: ' + error); } }); }); // 初次加載時運行一次,如果有預設選擇 var initialOption = $('input[name="pickup_option"]:checked').val(); if (initialOption) { $('input[name="pickup_option"]:checked').trigger('change'); } }); </script> <?php } // 處理 AJAX 請求來更新 session 狀態 add_action( 'wp_ajax_handle_pickup_option', 'handle_pickup_option' ); add_action( 'wp_ajax_nopriv_handle_pickup_option', 'handle_pickup_option' ); function handle_pickup_option() { if ( isset( $_POST['selected_option'] ) ) { $selected_option = sanitize_text_field( $_POST['selected_option'] ); WC()->session->set('pickup_option', $selected_option); $product_id_delivery = 3757; // 運費 ID // 根據選擇的選項進行處理 if ( $selected_option === 'delivery' ) { update_cart_for_delivery($product_id_delivery); } else { // 移除宅配產品 remove_cart_product($product_id_delivery); } } wp_die(); // 結束 AJAX 請求 } function update_cart_for_delivery($product_id_delivery) { // 獲取購物車總金額(排除稅金及運費) $cart_total = WC()->cart->get_subtotal(); if ( floatval( $cart_total ) < 3000 ) { // 如果金額小於 3000 元,添加宅配產品 handle_cart_product_delivery($product_id_delivery); } else { // 如果金額大於或等於 3000 元,移除宅配產品 remove_cart_product($product_id_delivery); } } function handle_cart_product_delivery($product_id_delivery) { // 檢查是否已經存在要添加的產品 $is_added = false; foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) { if ( $cart_item['product_id'] == $product_id_delivery ) { $is_added = true; break; } } // 如果產品不在購物車中,則添加 if ( ! $is_added ) { WC()->cart->add_to_cart( $product_id_delivery, 1 ); } } function remove_cart_product($product_id) { foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) { if ( $cart_item['product_id'] == $product_id ) { WC()->cart->remove_cart_item( $cart_item_key ); } } } // 根據選擇的自取方式自動填寫並禁用地址字段 add_action( 'wp_footer', 'auto_fill_and_disable_address_based_on_pickup_option' ); function auto_fill_and_disable_address_based_on_pickup_option() { if ( is_checkout() ) { ?> <script type="text/javascript"> jQuery(document).ready(function($) { function fillAndDisableAddressFields() { var selectedOption = $('input[name="pickup_option"]:checked').val(); if (selectedOption === 'factory') { // 安平區門市自取 $('#select2-billing_state-container').text('臺南市').trigger('change'); $('#select2-billing_city-container').text('安平區').trigger('change'); $('#billing_address_1').val('地址1').trigger('change'); // 禁用地址字段 $('#select2-billing_state-container').prop('disabled', true); $('#select2-billing_city-container').prop('disabled', true); $('#billing_address_1').prop('disabled', true); } else if (selectedOption === 'store') { // 東區門市自取 $('#select2-billing_state-container').text('臺南市').trigger('change'); $('#select2-billing_city-container').text('東區').trigger('change'); $('#billing_address_1').val('地址2').trigger('change'); // 禁用地址字段 $('#select2-billing_state-container').prop('disabled', true); $('#select2-billing_city-container').prop('disabled', true); $('#billing_address_1').prop('disabled', true); } else { // 啟用地址字段 $('#select2-billing_state-container').prop('disabled', false); $('#select2-billing_city-container').prop('disabled', false); $('#billing_address_1').prop('disabled', false); } } // 初次加載時運行一次 fillAndDisableAddressFields(); // WooCommerce 可能重新加載表單,需監控變動 $(document.body).on('updated_checkout', function() { fillAndDisableAddressFields(); }); // 監聽選項變動 $(document).on('change', 'input[name="pickup_option"]', function() { fillAndDisableAddressFields(); }); }); </script> <?php } } // 監聽購物車變動來處理金額超過 3000 元的情況 add_action( 'woocommerce_after_calculate_totals', 'check_cart_total_for_delivery_product' ); function check_cart_total_for_delivery_product() { $product_id_delivery = 3757; // 宅配產品 ID $cart_total = WC()->cart->get_subtotal(); if ( floatval( $cart_total ) >= 3000 ) { remove_cart_product($product_id_delivery); } } // 保存選擇的自取地址 add_action( 'woocommerce_checkout_update_order_meta', 'save_custom_pickup_address' ); function save_custom_pickup_address( $order_id ) { if ( isset( $_POST['pickup_option'] ) ) { $pickup_option = sanitize_text_field( $_POST['pickup_option'] ); if ( $pickup_option === 'factory' ) { // 安平區門市自取 update_post_meta( $order_id, '_billing_state', '臺南市' ); update_post_meta( $order_id, '_billing_city', '安平區' ); update_post_meta( $order_id, '_billing_address_1', '地址1' ); } elseif ( $pickup_option === 'store' ) { // 東區門市自取 update_post_meta( $order_id, '_billing_state', '臺南市' ); update_post_meta( $order_id, '_billing_city', '東區' ); update_post_meta( $order_id, '_billing_address_1', '地址2' ); } } } // 自動選擇支付方式 add_action( 'wp_footer', 'auto_select_payment_method_based_on_pickup_option' ); function auto_select_payment_method_based_on_pickup_option() { if ( is_checkout() ) { ?> <script type="text/javascript"> jQuery(document).ready(function($) { // 設置支付方式 function setPaymentMethod() { var selectedOption = $('input[name="pickup_option"]:checked').val(); if (selectedOption === 'factory' || selectedOption === 'store') { // 預選工廠自取或門市自取時的支付方式 $('#payment_method_woocg-post-513').prop('checked', true).trigger('change'); } else if (selectedOption === 'delivery') { // 預選宅配時的支付方式 $('#payment_method_ctbc-credit').prop('checked', true).trigger('change'); } } // 初次加載時運行一次 setPaymentMethod(); // 監聽選項變動來改變支付方式 $(document).on('change', 'input[name="pickup_option"]', function() { setPaymentMethod(); }); // WooCommerce 更新結帳表單時,重新設置支付方式 $(document.body).on('updated_checkout', function() { setPaymentMethod(); }); }); </script> <?php } }