Расширение хранилищ данных CRUD в WooCommerce

Опубликовано: 2018-01-25

Вы слышали о CRUD? В программировании это означает создание , чтение , обновление и удаление — основные операции, которые мы все выполняем с нашими данными. С 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.
  • Получение данных о продукте из существующей базы данных в другой системе.
  • Совместное использование товарных запасов на нескольких сайтах (пример ниже).
    Получение данных о продукте через 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 Новые вебхуки CRUD.

Используйте свое воображение, чтобы создавать решения для данных новыми и интересными способами с объектами CRUD и хранилищами данных, и обязательно сообщите нам, как вы поживаете, либо в комментариях, либо присоединившись к сообществу WooCommerce Slack.