WooCommerceでのCRUDデータストアの拡張

公開: 2018-01-25

CRUDについて聞いたことがありますか? プログラミングでは、 C reate、 R ead、 U pdate、およびD eleteの略であり、私たち全員がデータを使用して実行する基本的な操作です。 WooCommerceを使用すると、データベースに保存されている製品、注文、顧客、クーポン、およびその他のデータが含まれます。

CRUDに関連するWooCommerceの最近の変更は、プラットフォームがよりスケーラブルになりつつあることを意味します。 注:この投稿は技術的になり、PHPコードである程度の快適さを前提としています。

オーディオ学習者? この投稿のポイントは、WooConf2017での私の講演からのものです。

よりスケーラブルなWooCommerce

開発者の生活を楽にするために、WooCommerce3.0に特別なCRUDオブジェクトを追加しました。 これは、WooCommerceの以前のすべての投稿メタコードを置き換え、WooCommerceサイトを拡張できるようにするためにすべての拡張機能で使用する必要があります。

同時に、データストアと呼ばれる別のオブジェクトのセットを追加しました。これは、WooCommerceデータをデータベースとの間でロードおよび保存するように設計されています。 これらの抽象化は、WooCommerceが大量の注文、製品、および顧客を処理できるように設計されています。 これは、WooCommerceに接続して、データを保存するためにさまざまな手段を使用させることで実現されます。

各データストアの実装は、データがデータベースからのものであるか、データを完全に保存する別の方法であるかにかかわらず、データの保存方法と取得方法を決定します。 それらを使用することで、WooCommerceをエンタープライズ販売量にまで拡大することが可能になり、数百万の注文を処理できる実装が可能になりました。 実行する必要があるのは、WooCommerceがデータの保存に使用するものを再定義するフィルターにフックすることだけです。

CRUDとデータストアの抽象化によって提供されるパフォーマンスの向上に加えて、これらの構造により、WooCommerceストアのデータを保存およびロードする方法が大幅に柔軟になります。 WooCommerceデータのタイプ(製品、注文、顧客など)ごとに、データをどこから取得し、どこに送信するかをプログラムで決定できるようになりました。 これにより、ストアビルダーは、他のシステムとのインターフェースによってWooCommerceをニーズに合わせて調整したり、必要に応じてWooCommerceのさまざまな部分のパフォーマンスをアップグレードしたりできます。

CRUDとデータストアの抽象化によって提供されるパフォーマンスの向上に加えて、これらの構造により、WooCommerceストアのデータを保存およびロードする方法が大幅に柔軟になります。

それは正確にはどういう意味ですか? さて、可能性について考えてください:

  • 注文データをwpdbとは別のデータベースに保存します。
  • 別のシステム上の既存のデータベースから製品データを取得する。
  • 複数のサイト間で製品在庫を共有する(以下の例)。
    別のソースからAPIを介して製品データを取得します。
    あるデータストアからロードして別のデータストアに保存するCLIコマンドを作成する(組み込みのインポート/エクスポート)。

データストアの拡張

CRUDとデータストアの抽象化により、WooCommerceはデータの出所や保存方法を気にしなくなりました。 あなたはそれをすべて自分でコントロールすることができます。

以下の例では、個別のサービスから在庫数を取得し、各製品オブジェクトの在庫数のみが変更されています。 これを行うことの利点の1つは、同じ在庫数から複数の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_InterfaceWC_Product_Data_Store_Interfaceの2つです。

このデータストアは、既存のデータストア(通常はデフォルトのポストメタ実装)を拡張するように設計されています。 コンストラクターで既存のデータストアを取得し、インベントリの処理方法のみを変更します。 それ以外はすべて、既存のデータストアを介して通常どおり処理されます。

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オブジェクトとデータストアの無限の可能性

上記の例で示されているように、可能性は無限大です。 1月30日にリリース予定のWooCommerce3.3には、CRUDに関連するさらにエキサイティングなマイルストーンが含まれています。 詳細:WooCommerce3.3新しいWebhookCRUD。

想像力を駆使して、CRUDオブジェクトとデータストアを使用して新しく興味深い方法でデータソリューションを作成し、コメントまたはWooCommerceSlackコミュニティに参加してどのようにうまくいくかをお知らせください。