ผู้เขียน หัวข้อ: เพิ่มสินค้าอัตโนมัติ กรณีสินค้านั้นมีหลายตัวเลือก : WooCommerce  (อ่าน 723 ครั้ง)

0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้

ออฟไลน์ smf

  • [color=green][i]"ถ้าคุณไม่สามารถอธิบายอย่างง่ายๆ ให้คนอื่นเข้าใจได้แล้วล่ะก็ แสดงว่าคุณยังเข้าใจมันไม่ดีพอ"[/i][/color]
  • Administrator
  • Hero Member
  • *****
  • กระทู้: 1,368
  • พอยท์: 5
    • ดูรายละเอียด
    • pordoo.com
    • อีเมล์
ตามปรกติปุ่ม Add to cart ของ WooCommerce เองก็เพิ่มสินค้าให้อัตโนมัติอยู่แล้ว เพียงแต่ถ้าเมื่อไหร่สินค้านั้น มีหลายตัวเลือก หรือถ้าดูในหลังบ้านของ WooCommerce ก็คือ มีการตั้งค่า Variation ให้กับสินค้า ตัวอย่างเช่น สินค้า A มี 2 สี 2 ขนาด คือ สีแดง ขนาด 5ml, สีแดง ขนาด 30ml, สีเขียว ขนาด 5ml และสีเขียว ขนาด 30ml แบบนี้จะทำให้เมื่อเรากดปุ่ม Add to cart แล้ว ตัว WooCommerce จะพาเราไปยังหน้าของสินค้านั้น เพื่อให้เราเลือกก่อนว่า จะเอาสีไหน ขนาดไหน

คราวนี้ได้โจทย์มาจากลูกค้าว่า อยากจะให้เมื่อคนซื้อมากดปุ่ม Add to cart แล้ว ระบบจะเพิ่มสินค้าเข้าตะกร้าสินค้าให้เองอัตโนมัติจำนวน 1 ชิ้น</blockquote> ซึ่งในหลังบ้านของ WooCommerce ในส่วนของ Product แต่ละชิ้นนั้น จะมีส่วนให้ตั้งค่า Default Variation ของสินค้าชิ้นนั้นๆ อยู่แล้ว เลยใช้ส่วนนี้มาต่อยอดปรับแต่งปุ่ม Add to cart ให้ทำงานแบบที่ลูกค้าต้องการได้

ก่อนอื่นต้องทำความเข้าใจเรื่อง Template ของ WooCommerce ก่อน http://docs.woothemes.com/document/template-structure/ ไม่ขออธิบายนะครับ ไปอ่านดู

โดยปุ่ม Add to cart จะมีอยู่ 2 ส่วนคือ ส่วนของหน้ารวมสินค้า กับส่วนของหน้ารายละเอียดสินค้า ซึ่งปุ่ม Add to cart ที่เราต้องการจะปรับคือ หน้ารวมของสินค้า โดย File ที่เราต้องทำการแก้ไข จะอยู่ใน path yourtheme/woocommerce/loop/add-to-cart.php (อันนี้ยึดหลักตาม WooCommerce 2.2.2) ซึ่งใน File จะเขียนไว้ดังนี้
       
<?php
/**
* Loop Add to Cart
*
* @author       WooThemes
* @package    WooCommerce/Templates
* @version     2.1.0
*/
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
global $product;
echo apply_filters( 'woocommerce_loop_add_to_cart_link',
   sprintf( '<a href="%s" rel="nofollow" data-product_id="%s" data-product_sku="%s" class="button %s product_type_%s">%s</a>',
      esc_url( $product->add_to_cart_url() ),
      esc_attr( $product->id ),
      esc_attr( $product->get_sku() ),
      $product->is_purchasable() && $product->is_in_stock() ? 'add_to_cart_button' : '',
      esc_attr( $product->product_type ),
      esc_html( $product->add_to_cart_text() )
   ),
$product );
 
  ผมเลยเพิ่มโค้ดเข้าไปเป็นแบบนี้
       
<?php
/**
* Loop Add to Cart
*
* @author       WooThemes
* @package    WooCommerce/Templates
* @version     2.1.0
*/
if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
global $product;
echo (sprintf( '<a href="%s" class="button">%s</a>', esc_url( get_permalink( $product->id )), 'View Details' ));
if( $product->has_child() ) {
   $selected_attributes = $product->get_variation_default_attributes();
   $title = array_keys($selected_attributes);
   $available_variations = $product->get_available_variations();
   foreach ( $available_variations as $this_variation ) {
      $matchcheck = 0;
      for ($i=0; $i < sizeof($title) ; $i++) {
         if ( $this_variation['attributes']['attribute_' . $title[$i]] == $selected_attributes[$title[$i]] ) {
            $matchcheck = $matchcheck + 1;
         }
      }
      if ( sizeof($title) == $matchcheck) {
         $variation_id = $this_variation['variation_id'];
      }
   }
}
?>
<?php if ( ! empty( $selected_attributes ) ) : ?>
<form class="variations_form cart" method="post" enctype='multipart/form-data'>
   <?php for ($i=0; $i < sizeof($title) ; $i++) { ?>
      <input type="hidden" id="<?php echo $title[$i]; ?>" name="attribute_<?php echo $title[$i]; ?>" value="<?php echo $selected_attributes[$title[$i]]; ?>">
   <?php } ?>
   <input type="hidden" name="quantity" value="1" title="Qty">
   <button type="submit" class="single_add_to_cart_button button alt"><?php echo $product->single_add_to_cart_text(); ?></button>

   <input type="hidden" name="add-to-cart" value="<?php echo $product->id; ?>" />
   <input type="hidden" name="product_id" value="<?php echo $product->id; ?>" />
   <input type="hidden" name="variation_id" value="<?php echo $variation_id; ?>" />
</form>
<?php else :
   echo apply_filters( 'woocommerce_loop_add_to_cart_link',
   sprintf( '<a href="%s" rel="nofollow" data-product_id="%s" data-product_sku="%s" class="button %s product_type_%s">%s</a>',
      esc_url( $product->add_to_cart_url() ),
      esc_attr( $product->id ),
      esc_attr( $product->get_sku() ),
      $product->is_purchasable() ? 'add_to_cart_button' : '',
      esc_attr( $product->product_type ),
      esc_html( $product->single_add_to_cart_text() )
   ),
   $product );
endif; ?>
 
  โดยเช็คว่าสินค้านั้น มีตัวเลือกหรือเปล่า หลังจากนั้นมาเช็คว่ามีค่า Default ตั้งไว้มั้ย ส่วน form ที่ใช้ในการส่งค่าสำหรับเพิ่มสินค้าเข้าตะกร้านั้น นำมาจากปุ่ม Add to cart ของหน้ารายละเอียดสินค้า เพียงแต่เรากำหนดค่าของตัวเลือกลงไปเลย รวมถึงจำนวน 1 ชิ้นด้วย


ที่มา: http://rabbitinblack.com/2014/09/variation-add-to-cart-woocommerce/
« แก้ไขครั้งสุดท้าย: 8 สิงหาคม 2016, 00:44:06 โดย smf »