WooCommerce
Shipping Zone คืออะไรและทำงานอย่างไร
Shipping Zone ใน WooCommerce คือการแบ่งพื้นที่จัดส่งออกเป็นกลุ่ม ๆ แต่ละกลุ่มจะมีกฎค่าขนส่งของตัวเอง เช่น กรุงเทพฯ ส่งฟรีเมื่อซื้อครบ 500 บาท ส่วนต่างจังหวัดคิดค่าส่งแบบ Flat Rate 60 บาท และต่างประเทศคิดตามน้ำหนักจริง วิธีนี้ช่วยให้ร้านค้าออนไลน์กำหนดนโยบายค่าส่งได้อย่างยืดหยุ่นโดยไม่ต้องเขียนโค้ดเลย
ระบบจะทำงานโดยดูที่อยู่ที่ลูกค้ากรอกในหน้า Checkout จากนั้น WooCommerce จะจับคู่กับ Zone ที่ตรงกันมากที่สุด แล้วแสดงเฉพาะ Shipping Method ที่เปิดใช้งานใน Zone นั้น ๆ ให้ลูกค้าเลือก ถ้าไม่มี Zone ไหนตรงเลย ระบบจะใช้ Rest of the World เป็น fallback อัตโนมัติ
การกำหนด Zone ทำได้ 3 ระดับ คือ ประเทศ, จังหวัด/รัฐ และรหัสไปรษณีย์ (Postcode) สำหรับร้านค้าในไทยที่ต้องการแยกค่าส่งกรุงเทพฯ กับต่างจังหวัดอย่างแม่นยำ แนะนำให้ใช้การระบุจังหวัดหรือรหัสไปรษณีย์เพื่อความถูกต้องสูงสุด
Shipping Method ที่ WooCommerce มีมาให้ในตัวมี 3 แบบหลัก ได้แก่:
- Flat Rate — ค่าส่งคงที่ เช่น 50 บาทต่อ Order หรือบวกเพิ่มตามจำนวนชิ้น
- Free Shipping — ส่งฟรีเมื่อเข้าเงื่อนไขที่กำหนด เช่น ซื้อครบ 1,000 บาท หรือใช้ Coupon
- Local Pickup — ลูกค้ามารับสินค้าเองที่ร้าน ไม่มีค่าส่ง
สร้าง Zone: กรุงเทพและปริมณฑล
เริ่มต้นด้วยการไปที่เมนู WooCommerce → Settings → Shipping แล้วคลิกปุ่ม Add shipping zone ตั้งชื่อ Zone เป็น "กรุงเทพและปริมณฑล" จากนั้นในช่อง Zone regions ให้เลือกประเทศ Thailand ก่อน แล้วขยายลงไปเลือกจังหวัดที่ต้องการจาก dropdown ได้แก่ กรุงเทพมหานคร, นนทบุรี, ปทุมธานี, สมุทรปราการ และสมุทรสาคร
หลังจากกำหนด Zone regions เสร็จ ให้เลื่อนลงมาที่ส่วน Shipping methods แล้วคลิก Add shipping method เพื่อเพิ่ม Flat Rate สำหรับกรุงเทพฯ ตั้งค่าคือ Cost = 50 (บาท) หรือถ้าต้องการบวกเพิ่มตามจำนวนสินค้า ให้ใส่สูตร [qty] * 10 + 30 ซึ่งหมายถึงค่าส่งเริ่มต้น 30 บาท บวกอีก 10 บาทต่อชิ้น
จากนั้นให้เพิ่ม Free Shipping อีก 1 Method ใน Zone เดียวกัน เพื่อให้ลูกค้ากรุงเทพฯ ได้รับส่งฟรีเมื่อซื้อครบ 500 บาท โดยตั้ง Requires ให้เป็น "A minimum order amount" และกำหนด Minimum order amount = 500 วิธีนี้จะทำให้ลูกค้าเห็นตัวเลือกทั้ง 2 แบบในหน้า Checkout คือ Flat Rate และ Free Shipping (ถ้าครบเงื่อนไข)
- ไปที่ WooCommerce → Settings → Shipping → Add shipping zone
- ตั้งชื่อ: กรุงเทพและปริมณฑล
- เพิ่ม Zone regions: กรุงเทพมหานคร, นนทบุรี, ปทุมธานี, สมุทรปราการ, สมุทรสาคร
- คลิก Add shipping method → เลือก Flat Rate → Save → แก้ Cost เป็น 50
- คลิก Add shipping method อีกครั้ง → เลือก Free Shipping → ตั้ง Min order 500
- คลิก Save changes
สร้าง Zone: ต่างจังหวัด
Zone ต่างจังหวัดสร้างด้วยวิธีเดียวกัน แต่ครั้งนี้ให้เลือก Thailand เป็น Zone region แล้วเลือกจังหวัดอื่น ๆ ทั้งหมดที่เหลือจากกรุงเทพฯ และปริมณฑล หรือถ้าต้องการแยกอีกระดับ เช่น ภาคใต้กับภาคเหนือมีค่าส่งต่างกัน ก็สามารถสร้าง Zone แยกได้เลยตามจังหวัดที่เลือก
ค่าส่งต่างจังหวัดปกติจะแพงกว่ากรุงเทพฯ เล็กน้อย เนื่องจากระยะทางไกลกว่า แนะนำให้ตั้ง Flat Rate ไว้ที่ 60-80 บาท และถ้าต้องการให้มี Free Shipping สำหรับต่างจังหวัดด้วย ก็สามารถตั้ง Minimum order amount สูงกว่า เช่น 800 หรือ 1,000 บาท เพื่อคุ้มกับค่าขนส่งที่แพงกว่า
สำหรับร้านที่ใช้ไปรษณีย์ไทย (EMS) แนะนำให้เพิ่ม Description ใน Flat Rate ระบุชื่อบริษัทขนส่งและระยะเวลาจัดส่งโดยประมาณ เช่น "ไปรษณีย์ไทย EMS 1-3 วันทำการ" เพื่อให้ลูกค้าทราบข้อมูลก่อนชำระเงิน ฟีเจอร์นี้จะช่วยลดการ cancel order จากลูกค้าที่ไม่รู้ระยะเวลาล่วงหน้า
- ตั้งชื่อ Zone: ต่างจังหวัด (หรือ ทั่วประเทศไทย)
- Zone regions: เลือก Thailand ทั้งประเทศ (ระบบจะให้ Zone กรุงเทพฯ ที่เจาะจงกว่า override อัตโนมัติ)
- Flat Rate: ตั้ง Cost = 60-80 บาท พร้อม Description ระบุชื่อขนส่ง
- Free Shipping: Min order = 1,000 บาท (ถ้าต้องการ)
- ไม่ต้องเพิ่ม Local Pickup ถ้าร้านอยู่ในกรุงเทพฯ เท่านั้น
สร้าง Zone: ต่างประเทศ
ถ้าร้านค้าของคุณรับออเดอร์จากต่างประเทศ ให้สร้าง Zone เพิ่มเติมสำหรับประเทศที่ต้องการรองรับ เช่น เพิ่ม Zone "เอเชียตะวันออกเฉียงใต้" แล้วเลือกประเทศ Malaysia, Singapore, Vietnam, Cambodia ฯลฯ หรือจะสร้าง Zone "ทั่วโลก" โดยใช้ Rest of the World ซึ่ง WooCommerce จะจัดการให้อัตโนมัติสำหรับประเทศที่ไม่ได้ระบุใน Zone อื่น
ค่าส่งต่างประเทศมักจะซับซ้อนกว่า เพราะขึ้นอยู่กับน้ำหนัก ขนาด และปลายทาง WooCommerce แบบ built-in ไม่มีการคิดค่าส่งตามน้ำหนักโดยตรง แต่สามารถใช้ Flat Rate ตั้งราคาเหมาจ่ายต่อประเทศได้ หรือถ้าต้องการคิดตามน้ำหนักจริง แนะนำให้ใช้ Plugin เพิ่มเติม เช่น Table Rate Shipping ที่รองรับการตั้งราคาตามน้ำหนัก/ขนาด/จำนวนสินค้า
อีกทางเลือกคือตั้ง Free Shipping สำหรับต่างประเทศไว้ที่ราคาสูงมาก เช่น 10,000 บาท เพื่อป้องกันการใช้งานผิดพลาด แต่ยังคงเปิดตัวเลือกไว้ในกรณีที่ต้องการมอบโปรโมชั่นพิเศษให้ลูกค้าต่างประเทศรายใดรายหนึ่ง
- สร้าง Zone: ต่างประเทศ หรือแยกตามภูมิภาค (ASEAN / ยุโรป / อเมริกา)
- Zone regions: เลือกประเทศที่รองรับทีละประเทศ หรือเลือก "Rest of the World"
- Flat Rate: ตั้งราคาตามปลายทาง เช่น ASEAN = 300 บาท, ยุโรป = 800 บาท
- แนะนำให้เพิ่ม Title ใน Flat Rate ระบุชื่อขนส่ง เช่น "DHL / FedEx International"
- Local Pickup: ไม่จำเป็นสำหรับ Zone ต่างประเทศ
ตั้งค่า Free Shipping เมื่อซื้อครบ X บาท
Free Shipping เป็นกลยุทธ์ที่ร้านค้าออนไลน์ไทยนิยมใช้มากที่สุด เพราะช่วยกระตุ้นให้ลูกค้าซื้อเพิ่มเพื่อให้ครบยอดที่กำหนด ใน WooCommerce สามารถตั้งเงื่อนไข Free Shipping ได้ 4 แบบ ได้แก่ ไม่มีเงื่อนไข (ส่งฟรีทุกออเดอร์), ต้องใช้ Coupon, ซื้อครบยอดขั้นต่ำ และใช้ Coupon + ซื้อครบยอดขั้นต่ำ
สำหรับร้านค้าส่วนใหญ่ในไทย แนะนำให้ใช้ "A minimum order amount" โดยตั้ง Minimum order amount ให้สูงกว่าค่าส่งเฉลี่ยสัก 5-10 เท่า เช่น ถ้าค่าส่งเฉลี่ยอยู่ที่ 60 บาท ควรตั้ง Free Shipping ที่ยอดซื้อ 500-600 บาท เพื่อให้คุ้มกับต้นทุนขนส่งที่ร้านต้องรับ
ข้อควรระวังที่สำคัญคือฟิลด์ Minimum order amount ใน Free Shipping Method จะเปรียบเทียบกับ Order Subtotal (ราคาก่อนหักส่วนลด) หรือ Order Total (ราคาหลังหักส่วนลดแล้ว) ขึ้นอยู่กับการตั้งค่าใน WooCommerce → Settings → General → Coupons ถ้าต้องการให้ตรงกับที่ลูกค้าเห็น ให้ใช้ Order Total เพื่อหลีกเลี่ยงความสับสน
| Requires Option | เงื่อนไข | เหมาะกับ |
|---|---|---|
| None | ส่งฟรีทุกออเดอร์ | โปรโมชั่นช่วงพิเศษ |
| A valid coupon | ต้องใช้ Coupon | แจก Coupon ส่งฟรีให้ลูกค้า VIP |
| A minimum order amount | ซื้อครบยอดที่กำหนด | ใช้ทั่วไป — แนะนำสำหรับส่วนใหญ่ |
| A minimum order amount OR a coupon | ครบยอด หรือ มี Coupon | ยืดหยุ่นสูงสุด |
ซ่อน/แสดง Shipping Method ตามเงื่อนไข
บางครั้งเราต้องการซ่อน Flat Rate เมื่อมี Free Shipping แสดงอยู่ เพื่อไม่ให้ลูกค้าสับสนว่าจะเลือกแบบไหน WooCommerce มีฟีเจอร์นี้ในตัวเรียกว่า "Hide shipping costs until an address is entered" ซึ่งอยู่ใน WooCommerce → Settings → Shipping → Shipping options ช่วยให้ไม่แสดงค่าส่งจนกว่าลูกค้าจะกรอกที่อยู่ครบ
สำหรับการซ่อน Flat Rate โดยอัตโนมัติเมื่อ Free Shipping Available นั้น WooCommerce ตัวเดิมไม่มีฟีเจอร์นี้ แต่สามารถทำได้โดยใช้ Plugin เช่น "WooCommerce Advanced Free Shipping" หรือเพิ่ม code snippet ผ่าน functions.php ของ Theme ดังนี้ ให้ไปที่ Appearance → Theme File Editor → functions.php แล้วเพิ่มโค้ดที่ตรวจสอบว่า Free Shipping available หรือไม่ ถ้ามีให้ filter เอา Flat Rate ออก
นอกจากนี้ยังสามารถจัดการความสำคัญของ Zone ได้โดยการลากเพื่อเรียงลำดับ Zone ใน Shipping settings หน้าแรก WooCommerce จะใช้ Zone ที่เจาะจงที่สุด (เช่น ระบุจังหวัดหรือ Postcode) ก่อนเสมอ ดังนั้นต้องแน่ใจว่า Zone กรุงเทพฯ ที่ระบุจังหวัดไว้ชัดเจน จะถูกเลือกใช้ก่อน Zone ต่างจังหวัดที่เป็น "ทั้งประเทศ"
- WooCommerce → Settings → Shipping → Shipping options → ตั้งค่า "Hide shipping costs"
- ใช้ Plugin "Conditional Shipping and Payments" สำหรับเงื่อนไขซับซ้อน เช่น ซ่อนตาม User Role
- เรียงลำดับ Zone โดยลาก Zone ที่เจาะจงขึ้นมาไว้บน Zone ที่กว้างกว่า
- ทดสอบทุกครั้งหลังแก้ไขด้วยการ Incognito และกรอกที่อยู่จาก Zone ต่าง ๆ
- ตรวจสอบว่า Rest of the World Zone มี Method ครบเพื่อรองรับกรณี fallback
ตรวจสอบว่า Shipping Zone ทำงานถูกต้อง
หลังตั้งค่า Shipping Zone เสร็จแล้ว ควรทดสอบให้ครบทุก Zone ก่อนเปิดให้ลูกค้าใช้งานจริง วิธีที่ดีที่สุดคือลองสั่งซื้อสินค้าจริง ๆ ด้วย Incognito Mode แล้วกรอกที่อยู่จากแต่ละ Zone เพื่อดูว่า Shipping Method ที่แสดงตรงกับที่ตั้งค่าไว้หรือไม่ นอกจากนี้ยังสามารถตรวจสอบผ่าน WooCommerce Logs หรือดู Debug ผ่าน Console ได้
สำหรับนักพัฒนาหรือผู้ที่คุ้นเคยกับ WordPress admin สามารถใช้ WP-CLI เพื่อตรวจสอบและจัดการ Shipping Zones ได้โดยตรง รวมถึงใช้ Plugin Debug Bar เพื่อดูว่า WooCommerce เลือก Zone ไหนสำหรับที่อยู่ที่กรอกมา
# ดู Shipping Zones ทั้งหมดผ่าน WP-CLI
wp wc shipping_zone list --user=admin
# ดู Shipping Methods ใน Zone ID 1
wp wc shipping_zone_method list 1 --user=admin
# เพิ่ม Flat Rate ใน Zone ID 2 ผ่าน WP-CLI
wp wc shipping_zone_method create 2 \
--method_id=flat_rate \
--user=admin
# ดูข้อมูล Order และ Shipping ที่เลือกใช้
wp wc order get 123 --fields=shipping_lines --user=admin
# ล้าง WooCommerce Cache หลังแก้ Shipping Settings
wp cache flush && wp wc tool run clear_transients --user=admin
แก้ปัญหาที่พบบ่อย
ค่าส่งไม่แสดงในหน้า Checkout — ยังไม่ได้เพิ่ม Shipping Method ใน Zone
ปัญหานี้เกิดเมื่อสร้าง Zone แล้วแต่ลืมเพิ่ม Shipping Method เข้าไป Zone ที่ไม่มี Method จะไม่แสดงตัวเลือกค่าส่งให้ลูกค้า ให้ไปที่ WooCommerce → Settings → Shipping แล้วคลิก Edit Zone ที่มีปัญหา ตรวจสอบว่ามี Method อย่างน้อย 1 ตัวและสถานะเป็น Enabled อยู่ นอกจากนี้ให้ตรวจสอบ Shipping Options ว่าไม่ได้ตั้งค่าให้ซ่อนค่าส่งไว้
Free Shipping ไม่ Trigger แม้ซื้อครบ — Min Order ตั้งผิด Subtotal vs Total
WooCommerce Free Shipping สามารถเปรียบเทียบยอดได้ 2 แบบคือ Subtotal (ก่อนหักส่วนลด) กับ Total (หลังหักส่วนลดแล้ว) ปัญหาเกิดเมื่อตั้ง Min Order ไว้ที่ 500 บาท แต่ลูกค้าใช้ Coupon ลด 100 บาท ทำให้ Total เหลือ 400 บาทซึ่งไม่ถึงเงื่อนไข ให้ตรวจสอบที่ WooCommerce → Settings → General → Enable the use of coupon codes ว่ามีการตั้ง "Apply coupon discounts sequentially" หรือไม่ และแก้ไข Min Order ให้สอดคล้องกับพฤติกรรมลูกค้าที่ต้องการ
Customer เลือก Zone ผิด — ที่อยู่กรอกไม่ครบ หรือ Postcode ไม่ตรง
WooCommerce จะจับคู่ Zone โดยใช้ข้อมูลประเทศ, จังหวัด และรหัสไปรษณีย์ที่ลูกค้ากรอก ถ้าลูกค้ากรอกรหัสไปรษณีย์ผิดหรือไม่ตรงกับจังหวัดที่เลือก ระบบอาจเลือก Zone ผิด ให้ทดสอบด้วยการกรอก Postcode จริงของแต่ละ Zone แล้วดูว่าค่าส่งที่แสดงถูกต้องหรือไม่ นอกจากนี้ควรตรวจสอบว่าได้เลือกจังหวัดใน Zone Regions ถูกต้องและครบถ้วน
ราคาค่าส่งแสดงทับซ้อนหลาย Method — ต้องตั้ง Availability ให้ถูกต้อง
ถ้าลูกค้าเห็น Flat Rate และ Free Shipping พร้อมกันในหน้า Checkout และสับสนไม่รู้จะเลือกอะไร ปัญหาอาจเกิดจากการมีหลาย Method เปิดใช้งานพร้อมกันใน Zone เดียว วิธีแก้คือถ้าต้องการให้ Free Shipping ซ่อน Flat Rate อัตโนมัติเมื่อเงื่อนไขครบ ให้ใช้ Plugin เพิ่มเติมหรือเพิ่ม custom code ใน functions.php เพื่อ filter Shipping Rates ก่อนแสดงผล
คำถามที่พบบ่อย
[qty] * 20 (20 บาทต่อชิ้น) หรือ [qty] * 15 + 25 (25 บาทเริ่มต้น บวก 15 บาทต่อชิ้น) นอกจากนี้ยังมี Per Item Flat Rate ที่ตั้งใน "Per item shipping" ภายใน Flat Rate settings เพื่อควบคุมได้ละเอียดยิ่งขึ้น