توسيع مخازن بيانات 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 للتوسيع.

في الوقت نفسه ، أضفنا مجموعة أخرى من الكائنات تسمى مخازن البيانات ، وهي مصممة لتحميل وحفظ بيانات WooCommerce الخاصة بك من وإلى قاعدة البيانات. تم تصميم هذه الأفكار التجريدية لتمكين WooCommerce من التعامل مع عدد أكبر من الطلبات والمنتجات والعملاء. يتم تحقيق ذلك عن طريق الارتباط بـ WooCommerce لجعله يستخدم وسائل مختلفة لتخزين البيانات.

يحدد كل تطبيق لمخزن البيانات كيفية تخزين البيانات واستردادها ، سواء كانت من قاعدة بيانات أو طريقة أخرى لتخزين البيانات تمامًا. باستخدامهم ، أصبح من الممكن الآن توسيع نطاق WooCommerce إلى أحجام مبيعات المؤسسات ، مع تطبيقات يمكنها التعامل مع ملايين الطلبات. كل ما يجب القيام به هو ربط عامل التصفية الذي يعيد تعريف ما يستخدمه WooCommerce لتخزين البيانات.

بالإضافة إلى تحسينات الأداء التي يمكن أن توفرها تجريدات CRUD ومخزن البيانات ، تتيح هذه التركيبات قدرًا أكبر من المرونة في كيفية حفظ البيانات وتحميلها لمتجر WooCommerce. لكل نوع من بيانات WooCommerce (المنتجات ، الطلبات ، العملاء ، إلخ) ، لديك الآن القدرة على تحديد برمجيًا من أين يجب أن تأتي هذه البيانات ، وإلى أين يجب أن تذهب. يتيح ذلك لبناة المتاجر تصميم WooCommerce لتناسب احتياجاتهم من خلال التفاعل مع أنظمة أخرى ، أو ترقية أداء أجزاء مختلفة من WooCommerce حسب الحاجة.

بالإضافة إلى تحسينات الأداء التي يمكن أن توفرها تجريدات CRUD ومخزن البيانات ، تتيح هذه التركيبات قدرًا أكبر من المرونة في كيفية حفظ البيانات وتحميلها لمتجر WooCommerce.

بالضبط ما الذي يعنيه ذلك؟ حسنًا ، فكر في الاحتمالات:

  • حفظ بيانات الطلب في قاعدة بيانات منفصلة عن ملف wpdb.
  • الحصول على بيانات المنتج من قاعدة بيانات موجودة على نظام آخر.
  • مشاركة مخزون المنتجات عبر مواقع متعددة (المثال أدناه).
    جلب بيانات المنتج عبر واجهة برمجة التطبيقات من مصدر آخر.
    عمل أمر 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. في تطبيق العالم الحقيقي ، يمكن أن ينتقل استدعاء واجهة برمجة التطبيقات هذا إلى نظام مراقبة المخزون ، أو نقطة بيع ، أو حتى موقع WooCommerce آخر.

الكود الكامل للمثال أعلاه متاح على: https://github.com/coderkevin/woocommerce-product-inventory-datastore

احتمالات لا حصر لها مع كائنات CRUD ومخازن البيانات

كما هو موضح في الأمثلة أعلاه ، فإن الاحتمالات لا حصر لها. يحتوي WooCommerce 3.3 ، المقرر إصداره في 30 يناير ، على معلم آخر مثير يتعلق بـ CRUD. المزيد في: WooCommerce 3.3 New Webhooks CRUD.

استخدم خيالك لإنشاء حلول بيانات بطرق جديدة ومثيرة للاهتمام مع كائنات CRUD ومخازن البيانات ، وتأكد من إخبارنا بمدى أدائك إما في التعليقات أو من خلال الانضمام إلى مجتمع WooCommerce Slack.