การขยายพื้นที่เก็บข้อมูล CRUD ใน WooCommerce

เผยแพร่แล้ว: 2018-01-25

คุณเคยได้ยินเกี่ยวกับ CRUD หรือไม่? ในการเขียนโปรแกรม ย่อมาจาก C reate, R ead, U pdate และ D elete ซึ่งเป็นการดำเนินการพื้นฐานที่เราทุกคนดำเนินการกับข้อมูลของเรา ด้วย WooCommerce ซึ่งรวมถึงผลิตภัณฑ์ คำสั่งซื้อ ลูกค้า คูปอง และข้อมูลอื่น ๆ ที่จัดเก็บไว้ในฐานข้อมูลของคุณ

การเปลี่ยนแปลงล่าสุดของ WooCommerce ที่เกี่ยวข้องกับ CRUD หมายความว่าแพลตฟอร์มกำลังจะขยายขนาดได้มากขึ้น หมายเหตุ: โพสต์นี้ใช้เทคนิคและถือว่าระดับความสะดวกสบายด้วยโค้ด PHP

ผู้เรียนเสียง? ประเด็นในโพสต์นี้มาจากการพูดคุยของฉันที่ WooConf 2017

WooCommerce ที่ปรับขนาดได้มากขึ้น

เพื่อให้นักพัฒนาของเราใช้ชีวิตได้ง่ายขึ้น เราได้เพิ่มวัตถุ CRUD พิเศษใน WooCommerce 3.0 สิ่งนี้จะแทนที่รหัสเมตาของโพสต์ก่อนหน้าทั้งหมดใน WooCommerce และต้องใช้โดยส่วนขยายทั้งหมดเพื่อเปิดใช้งานไซต์ WooCommerce เพื่อปรับขนาด

ในเวลาเดียวกัน เราได้เพิ่มชุดของออบเจ็กต์ที่เรียกว่า Data Stores ซึ่งออกแบบมาเพื่อโหลดและบันทึกข้อมูล WooCommerce ของคุณเข้าและออกจากฐานข้อมูล นามธรรมเหล่านี้ออกแบบมาเพื่อให้ WooCommerce จัดการกับคำสั่งซื้อ ผลิตภัณฑ์ และลูกค้าจำนวนมากขึ้น ทำได้โดยการเชื่อมต่อกับ WooCommerce เพื่อให้มันใช้วิธีการต่างๆ ในการจัดเก็บข้อมูล

การใช้งานที่เก็บข้อมูลแต่ละรายการจะกำหนดวิธีการจัดเก็บและดึงข้อมูล ไม่ว่าจะเป็นจากฐานข้อมูลหรือวิธีการจัดเก็บข้อมูลอื่นทั้งหมด เมื่อใช้สิ่งเหล่านี้ ตอนนี้สามารถขยาย WooCommerce ได้ถึงปริมาณการขายระดับองค์กร ด้วยการใช้งานที่สามารถจัดการคำสั่งซื้อนับล้านได้ ทั้งหมดที่ต้องทำคือเชื่อมต่อตัวกรองที่กำหนดสิ่งที่ WooCommerce ใช้ในการจัดเก็บข้อมูล

นอกเหนือจากการปรับปรุงประสิทธิภาพที่ CRUD และนามธรรมของการจัดเก็บข้อมูลสามารถให้ได้ โครงสร้างเหล่านี้ยังให้ความยืดหยุ่นมากขึ้นในการบันทึกและโหลดข้อมูลสำหรับร้านค้า WooCommerce ของคุณ สำหรับข้อมูล WooCommerce แต่ละประเภท (ผลิตภัณฑ์ คำสั่งซื้อ ลูกค้า ฯลฯ) ตอนนี้ คุณมีความสามารถในการตัดสินใจว่าข้อมูลนั้นควรมาจากที่ใดและควรไปที่ใด ซึ่งช่วยให้ผู้สร้างร้านค้าปรับแต่ง WooCommerce ให้ตรงกับความต้องการของพวกเขาโดยเชื่อมต่อกับระบบอื่นๆ หรืออัปเกรดประสิทธิภาพของส่วนต่างๆ ของ WooCommerce ตามความจำเป็น

นอกเหนือจากการปรับปรุงประสิทธิภาพที่ CRUD และนามธรรมของการจัดเก็บข้อมูลสามารถให้ได้ โครงสร้างเหล่านี้ยังให้ความยืดหยุ่นมากขึ้นในการบันทึกและโหลดข้อมูลสำหรับร้านค้า WooCommerce ของคุณ

หมายความว่าอย่างไร? ลองคิดถึงความเป็นไปได้:

  • การบันทึกข้อมูลการสั่งซื้อในฐานข้อมูลแยกต่างหากจาก wpdb
  • รับข้อมูลผลิตภัณฑ์จากฐานข้อมูลที่มีอยู่บนระบบอื่น
  • การแชร์สินค้าคงคลังของผลิตภัณฑ์ในหลายไซต์ (ตัวอย่างด้านล่าง)
    กำลังดึงข้อมูลผลิตภัณฑ์ผ่าน API จากแหล่งอื่น
    การสร้างคำสั่ง CLI เพื่อโหลดจากที่เก็บข้อมูลหนึ่งและบันทึกไปยังอีกที่หนึ่ง (การนำเข้า/ส่งออกในตัว)

การขยายพื้นที่เก็บข้อมูล

ด้วย CRUD และการเก็บข้อมูลที่เป็นนามธรรม WooCommerce ไม่สนใจว่าข้อมูลมาจากไหนหรือจะบันทึกอย่างไร คุณสามารถควบคุมได้ด้วยตัวเองทั้งหมด

ในตัวอย่างด้านล่าง ฉันดึงข้อมูลจำนวนสินค้าคงคลังจากบริการแยกต่างหาก และมีการเปลี่ยนแปลงเฉพาะการนับสินค้าคงคลังของแต่ละออบเจ็กต์ผลิตภัณฑ์ ข้อดีอย่างหนึ่งของการทำเช่นนี้คือฉันสามารถมีไซต์ WooCommerce หลายไซต์ขายจากการนับสินค้าคงคลังเดียวกันได้ และต้องแน่ใจว่าฉันไม่ได้ขายหุ้นของฉันมากเกินไป

นี่คือจุดเริ่มต้น ตัวกรอง install_data_store

class WC_Product_Inventory_Data_Store_Plugin {
public function __construct() {
add_filter( 'woocommerce_data_stores', array( $this, 'install_data_store' ) );
}
public function install_data_store( $stores ) {
include_once dirname( __FILE__ ) . '/class-product-inventory-data-store.php';
$instance = new WC_Product_Inventory_Data_Store( $stores[ 'product' ] );
$stores[ 'product' ] = $instance;
return $stores;
}
}
new WC_Product_Inventory_Data_Store_Plugin();
view raw class-woocommerce-product-inventory-datastore-plugin.php hosted with ❤ by GitHub

สำหรับการเก็บข้อมูลจริง มีสองอินเตอร์เฟสที่จะนำไปใช้: WC_Object_Data_Store_Interface และ WC_Product_Data_Store_Interface

ที่เก็บข้อมูลนี้ออกแบบมาเพื่อเสริมการจัดเก็บข้อมูลที่มีอยู่ ใช้ที่เก็บข้อมูลที่มีอยู่ในตัวสร้างและปรับเปลี่ยนวิธีการจัดการสินค้าคงคลังเท่านั้น ทุกสิ่งทุกอย่างได้รับการจัดการตามปกติผ่านการจัดเก็บข้อมูลที่มีอยู่

class WC_Product_Inventory_Data_Store
implements WC_Object_Data_Store_Interface, WC_Product_Data_Store_Interface {
public function __construct( &$parent_data_store ) {
$this- > parent_instance = $this- > create_parent_instance( $parent_data_store );
}
view raw class-product-inventory-data-store.php hosted with ❤ by GitHub

สำหรับฟังก์ชันที่จำเป็นส่วนใหญ่ ที่เก็บข้อมูลนี้เพียงแค่เรียกที่เก็บข้อมูลพาเรนต์:

public function update( &$product ) {
$this- > parent_instance- > update( $product );
}
view raw class-product-inventory-data-store.php hosted with ❤ by GitHub

การเปลี่ยนแปลงเพียงอย่างเดียวที่เก็บข้อมูลนี้แนะนำคือวิธีการอ่านสินค้าคงคลัง ในกรณีนี้ จะอ่านจากที่เก็บข้อมูลหลักตามปกติ แต่จะแทนที่ปริมาณสต็อคก่อนส่งคืน:

public function read( &$product ) {
$this- > parent_instance- > read( $product );
$inventory_url = 'http://localhost:8080/api/inventory/' . $product- > get_sku();
$request = wp_remote_get( $inventory_url );
$response = wp_remote_retrieve_body( $request );
$data = json_decode( $response );
$product- > set_stock_quantity( $data );
}
view raw class-product-inventory-data-store.php hosted with ❤ by GitHub

ด้วย CRUD และการเก็บข้อมูลที่เป็นนามธรรม WooCommerce ไม่สนใจว่าข้อมูลมาจากไหนหรือจะบันทึกอย่างไร คุณสามารถควบคุมได้ด้วยตัวเองทั้งหมด

ปริมาณสต็อคด้านบนดึงมาจาก API ในแอปพลิเคชันในโลกแห่งความเป็นจริง การเรียก API นี้อาจไปที่ระบบควบคุมสินค้าคงคลัง หรือ POS หรือแม้แต่ไซต์ WooCommerce อื่น

รหัสที่สมบูรณ์สำหรับตัวอย่างข้างต้นมีอยู่ที่: https://github.com/coderkevin/woocommerce-product-inventory-datastore

ความเป็นไปได้ที่ไม่มีที่สิ้นสุดด้วยวัตถุ CRUD และการจัดเก็บข้อมูล

ดังที่แสดงในตัวอย่างข้างต้น ความเป็นไปได้ไม่มีที่สิ้นสุด WooCommerce 3.3 ซึ่งจะเปิดตัวในวันที่ 30 มกราคม มีเหตุการณ์สำคัญที่น่าตื่นเต้นเพิ่มเติมเกี่ยวกับ CRUD เพิ่มเติมได้ที่: WooCommerce 3.3 Webhooks CRUD ใหม่

ใช้จินตนาการของคุณเพื่อสร้างโซลูชันข้อมูลในรูปแบบใหม่และน่าสนใจด้วยวัตถุ CRUD และการจัดเก็บข้อมูล และอย่าลืมแจ้งให้เราทราบว่าคุณรู้สึกอย่างไรในความคิดเห็นหรือเข้าร่วมชุมชน WooCommerce Slack