Estendendo armazenamentos de dados CRUD no WooCommerce

Publicados: 2018-01-25

Você já ouviu falar do CRUD? Na programação, significa C reate, R ead, U pdate e D elete, operações básicas que todos realizamos com nossos dados. Com WooCommerce, isso inclui produtos, pedidos, clientes, cupons e outros dados armazenados em seu banco de dados.

Mudanças recentes no WooCommerce relacionadas ao CRUD significam que a plataforma está a caminho de ser mais escalável. Nota: Este post é técnico e assume um certo nível de conforto com o código PHP.

Audio-aprendiz? Os pontos deste post são da minha palestra na WooConf 2017.

Um WooCommerce mais escalável

Para facilitar a vida de nossos desenvolvedores, adicionamos objetos CRUD especiais no WooCommerce 3.0. Isso substitui todo o metacódigo de postagem anterior no WooCommerce e também deve ser usado por todas as extensões para permitir que um site WooCommerce seja dimensionado.

Ao mesmo tempo, adicionamos outro conjunto de objetos chamados Data Stores, projetados para carregar e salvar seus dados do WooCommerce de e para o banco de dados. Essas abstrações são projetadas para permitir que o WooCommerce lide com uma quantidade maior de pedidos, produtos e clientes. Isso é feito conectando-se ao WooCommerce para que ele use meios diferentes para armazenar dados.

Cada implementação de armazenamento de dados determina como os dados são armazenados e recuperados, seja de um banco de dados ou de outra forma de armazenamento de dados. Ao usá-los, agora é possível dimensionar o WooCommerce para volumes de vendas corporativos, com implementações que podem lidar com milhões de pedidos. Tudo o que deve ser feito é conectar-se a um filtro que redefine o que o WooCommerce usa para armazenar dados.

Além dos aprimoramentos de desempenho que as abstrações de armazenamento de dados e CRUD podem fornecer, essas construções permitem muito mais flexibilidade em como você salva e carrega dados para sua loja WooCommerce. Para cada tipo de dado do WooCommerce (produtos, pedidos, clientes, etc.), agora você tem a capacidade de decidir programaticamente de onde esses dados devem vir e para onde devem ir. Isso permite que os construtores de lojas personalizem o WooCommerce para atender às suas necessidades, fazendo interface com outros sistemas ou atualizem o desempenho de diferentes partes do WooCommerce, conforme necessário.

Além dos aprimoramentos de desempenho que as abstrações de armazenamento de dados e CRUD podem fornecer, essas construções permitem muito mais flexibilidade em como você salva e carrega dados para sua loja WooCommerce.

O que exatamente isso significa? Bem, pense nas possibilidades:

  • Salvando dados do pedido em um banco de dados separado do wpdb.
  • Obtendo dados do produto de um banco de dados existente em outro sistema.
  • Compartilhamento de inventário de produtos em vários sites (exemplo abaixo).
    Buscando dados do produto por meio de uma API de outra fonte.
    Fazendo um comando CLI para carregar de um armazenamento de dados e salvar em outro (importação/exportação integrada).

Estendendo armazenamentos de dados

Com as abstrações de CRUD e armazenamento de dados, o WooCommerce não se importa mais de onde os dados vêm ou como são salvos. Você pode controlar tudo isso sozinho.

No exemplo abaixo, recupero a contagem de estoque de um serviço separado e apenas a contagem de estoque de cada objeto de produto é alterada. Um benefício de fazer isso é que posso ter vários sites WooCommerce vendendo a partir da mesma contagem de estoque e ter certeza de que não supervendi meu estoque.

Aqui está o ponto de entrada, o filtro 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

Para o armazenamento de dados real, há duas interfaces a serem implementadas: WC_Object_Data_Store_Interface e WC_Product_Data_Store_Interface .

Esse armazenamento de dados foi projetado para aumentar o armazenamento de dados existente (geralmente a meta-implementação post padrão). Ele pega o armazenamento de dados existente em seu construtor e modifica apenas a maneira como o inventário é tratado. Todo o resto é tratado normalmente por meio do armazenamento de dados existente.

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

Para a maioria das funções necessárias, esse armazenamento de dados apenas chama o armazenamento de dados pai:

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

A única alteração que esse armazenamento de dados apresenta é como o inventário é lido. Para este caso, ele lê o armazenamento de dados pai normalmente, mas substitui a quantidade de estoque antes de retornar:

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

Com as abstrações de CRUD e armazenamento de dados, o WooCommerce não se importa mais de onde os dados vêm ou como são salvos. Você pode controlar tudo isso sozinho.

A quantidade de estoque acima é recuperada de uma API. Em um aplicativo do mundo real, essa chamada de API pode ir para um sistema de controle de estoque, um POS ou até outro site WooCommerce.

O código completo para o exemplo acima está disponível em: https://github.com/coderkevin/woocommerce-product-inventory-datastore

Infinitas possibilidades com objetos CRUD e armazenamentos de dados

Conforme demonstrado nos exemplos acima, as possibilidades são infinitas. O WooCommerce 3.3, com lançamento previsto para 30 de janeiro, contém mais um marco empolgante relacionado ao CRUD. Mais em: WooCommerce 3.3 Novos Webhooks CRUD.

Use sua imaginação para criar soluções de dados de maneiras novas e interessantes com objetos CRUD e armazenamentos de dados, e não se esqueça de nos informar como você se sai nos comentários ou participando da comunidade WooCommerce Slack.