<?php defined('ABSPATH') || exit; class WC_Data_Store { private $instance = null; private $stores = array('coupon' => 'WC_Coupon_Data_Store_CPT', 'customer' => 'WC_Customer_Data_Store', 'customer-download' => 'WC_Customer_Download_Data_Store', 'customer-download-log' => 'WC_Customer_Download_Log_Data_Store', 'customer-session' => 'WC_Customer_Data_Store_Session', 'order' => 'WC_Order_Data_Store_CPT', 'order-refund' => 'WC_Order_Refund_Data_Store_CPT', 'order-item' => 'WC_Order_Item_Data_Store', 'order-item-coupon' => 'WC_Order_Item_Coupon_Data_Store', 'order-item-fee' => 'WC_Order_Item_Fee_Data_Store', 'order-item-product' => 'WC_Order_Item_Product_Data_Store', 'order-item-shipping' => 'WC_Order_Item_Shipping_Data_Store', 'order-item-tax' => 'WC_Order_Item_Tax_Data_Store', 'payment-token' => 'WC_Payment_Token_Data_Store', 'product' => 'WC_Product_Data_Store_CPT', 'product-grouped' => 'WC_Product_Grouped_Data_Store_CPT', 'product-variable' => 'WC_Product_Variable_Data_Store_CPT', 'product-variation' => 'WC_Product_Variation_Data_Store_CPT', 'shipping-zone' => 'WC_Shipping_Zone_Data_Store', 'webhook' => 'WC_Webhook_Data_Store'); private $current_class_name = ''; private $object_type = ''; public function __construct($object_type) { $this->object_type = $object_type; $this->stores = apply_filters('woocommerce_data_stores', $this->stores); if (!array_key_exists($object_type, $this->stores)) { $pieces = explode('-', $object_type); $object_type = $pieces[0]; } if (array_key_exists($object_type, $this->stores)) { $store = apply_filters('woocommerce_' . $object_type . '_data_store', $this->stores[$object_type]); if (is_object($store)) { if (!$store instanceof WC_Object_Data_Store_Interface) { throw new Exception(__('Invalid data store.', 'woocommerce')); } $this->current_class_name = get_class($store); $this->instance = $store; } else { if (!class_exists($store)) { throw new Exception(__('Invalid data store.', 'woocommerce')); } $this->current_class_name = $store; $this->instance = new $store(); } } else { throw new Exception(__('Invalid data store.', 'woocommerce')); } } public function __sleep() { return array('object_type'); } public function __wakeup() { $this->__construct($this->object_type); } public static function load($object_type) { return new WC_Data_Store($object_type); } public function get_current_class_name() { return $this->current_class_name; } public function read(&$data) { $this->instance->read($data); } public function create(&$data) { $this->instance->create($data); } public function update(&$data) { $this->instance->update($data); } public function delete(&$data, $args = array()) { $this->instance->delete($data, $args); } public function __call($method, $parameters) { if (is_callable(array($this->instance, $method))) { $object = array_shift($parameters); $parameters = array_merge(array(&$object), $parameters); return $this->instance->{$method}(...$parameters); } } }