Como adicionar um método de envio personalizado no WooCommerce

Publicados: 2020-09-01

WooCommerce adicionar método de envio personalizado Se você conhece o WooCommerce, sabe que é uma ótima solução de comércio eletrônico gratuita, com um conjunto de recursos incrivelmente útil. O que se destaca é que o WooCommerce é desenvolvido com extensibilidade em mente, semelhante à modularidade do WordPress.

No entanto, se você precisar de algo extra do WooCommerce, geralmente descobre que o WooCommerce não oferece tudo o que você precisa, por exemplo, se você deseja adicionar um método de envio personalizado. No entanto, não se preocupe, pois neste breve tutorial, você aprenderá como criar um método de envio simples para WooCommerce, que calculará o custo do envio.

Além disso, você aprenderá como adicionar algumas restrições ao nosso plugin para que o método de envio esteja disponível para alguns países.

Regras de envio personalizadas para os métodos de envio

Nesta seção, criaremos regras de envio personalizadas para os métodos de envio que usaremos para criar o código. Definiremos como o método de envio calculará o custo e para onde ele poderá enviar. Isso significa que o custo será determinado pelo peso e zona para onde precisamos enviar.

Para este exemplo, enviaremos para os EUA, Canadá, Alemanha, Reino Unido, Itália, Espanha e Quênia. O Quênia será nossa Zona 0 por US$ 10, Itália Zona 1 por US$ 30, Espanha Zona 2 por US$ 50, Reino Unido Zona 2 por US$ 50, EUA e Canadá Zona 3 por US$ 70.

Para o peso, vamos precificá-los da seguinte forma: 0 – 10kgs grátis, 11 – 30kgs por $5, 31-50kgs por $10, e 51-100kgs por $20.

Você pode estar pronto para começar a codificar, mas ainda não! Primeiro, você precisa aprender sobre a API de envio do WooCommerce . Quando você deseja criar um método de envio personalizado, precisa estender a classe da classe abstrata WooCommerce WC_Shipping_Method. Possui alguns atributos definidos, que são:

  • $id : ID (slug, palavra-chave) do nosso envio que é necessário.
  • $number : Este é um ID inteiro.
  • $method_title : O nome do nosso envio mostrado no admin.
  • $method_description : Uma breve descrição do nosso envio mostrado em admin (opcional).
  • $enabled : String booleana, “sim” ou “não”, que informa se nosso envio está habilitado e se pode ser utilizado ou não.
  • $title : É usado para exibir nosso nome de envio em nosso site.
  • $availability : Isso define se o frete está disponível ou não.
  • $countries : Uma matriz de países para os quais este método está habilitado. O valor padrão é uma matriz vazia.
  • $tax_status : O valor padrão é tributável. Se um item for tributável, então o imposto será cobrado.
  • $fee : O valor padrão é 0
  • $minimum_fee : A taxa mínima para o método e o valor padrão é null.
  • $has_settings : Isso define se este método tem alguma configuração. O valor padrão é verdadeiro.
  • $supports : Um array contendo recursos que este método suporta. O valor padrão é uma matriz vazia.
  • $rates : Uma matriz de taxas e isso deve ser preenchido para registrar os custos de envio. O valor padrão é uma matriz vazia.

Os métodos definidos no WC_Shipping_Method são:

  • is_taxable() : Retorna se precisamos ou não calcular o imposto sobre a taxa de envio.
  • add_rate( $args = array() ) : Isso envia uma taxa de envio definida no parâmetro $args para o atributo $rates.
  • has_settings() : Retorna o valor do atributo $has_settings.
  • is_available() : Retorna se o envio estiver disponível e se houver países definidos no atributo $countries e o atributo $availability estiver definido para valores incluindo, específico ou excluindo, retornará verdadeiro ou falso se o país estiver disponível para envio .
  • get_title() : Retorna o título deste envio.
  • get_fee( $fee, $total ) : Retorna o valor da taxa para este envio com base na $fee e $total analisados.
  • supports( $feature ) : Retorna se este método de envio está suportando um recurso ou não.

Como a classe WC_Shipping_Method estende a classe WC_Settings_API, existem mais atributos e métodos, que não explicarei aqui para simplificar.

Além disso, outros métodos precisam ser definidos para que o frete possa obter ou definir configurações e calcular o custo real do frete. Esses métodos listados aqui:

  • init() : Isso cria os campos e configurações do formulário. No entanto, ele pode ser nomeado de forma diferente, desde que usemos os métodos dentro dele e o chamemos no método __constructor.
  • calculate_shipping( $package ) : Este método é usado para calcular o custo deste frete e o pacote é um array com os produtos a serem enviados.

Eu gostaria de colocar algum foco no método calculate_shipping. Para nosso exemplo, usaremos esse método e o adicionaremos ao método add_rate. Este método aceitará um array com várias opções como:

  • id : Este é o ID da taxa.
  • label : Este é o rótulo para a taxa.
  • cost : o valor do frete.
  • taxes : Aceita uma série de impostos ou nada, então o imposto é calculado pelo WooCommerce. Se você não quiser que ele aceite impostos, ele pode aceitar false.
  • calc_tax : Isso aceita per_order ou per_item. Se você usar per_item, uma matriz de custos precisará ser fornecida.

Usaremos um filtro WordPress para obter o array que adiciona nosso método de envio no array do método registrado passando o nome de nossa classe, usando um filtro WordPress que é definido dentro do plugin WooCommerce. O filtro é chamado woocommerce_shipping_methods.

Com isso em mente, vamos agora entrar na seção de codificação deste breve tutorial para que você possa entender todo o conceito nos trechos de PHP que vou compartilhar.

a) Etapas para criar a nova classe de remessa

Nesta seção, criaremos nosso método de envio como um novo plugin que estende o WooCommerce.

  1. Primeiro, você precisa abrir o wp-content> plugins e criar uma nova pasta. Para isso, usarei o nome njengah -shipping
  2. Então, você precisa criar um arquivo com o mesmo nome njengah –shipping.php
  3. Nesse arquivo adicione o seguinte código:
 <?php

/**
* Nome do plugin: Njengah Shipping
* URI do plug-in: https://njengah.com/plugins/
* Descrição: 
* Versão: 1.0.0
* Autor: Joe Njenga
* URI do autor: https://njengah.com
s
*/

if ( !defined( 'WPINC' ) ) {

morrer;

}
/*
* Verifique se o WooCommerce está ativo
*/
if (in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')))) {

function njengahplus_shipping_method() {

if (! class_exists( 'NjengahPlus_Shipping_Method') ) {

class NjengahPlus_Shipping_Method estende WC_Shipping_Method {

/**

* Construtor para sua classe de envio

*

* @acesso público

* @return nulo

*/

função pública __construct() {

$this->id = 'njengahplus';

$this->method_title = __( 'NjengahPlus Frete', 'njengahplus' );

$this->method_description = __( 'Método de envio personalizado para NjengahPlus', 'njengahplus' );

$this->init();

$this->enabled = isset( $this->settings['enabled'] ) ? $this->settings['enabled'] : 'sim';

$this->title = isset( $this->settings['title'] ) ? $this->settings['title'] : __( 'NjengahShipping', 'njengahplus' );

}

/**
* Inicie suas configurações
*
* @acesso público

* @return nulo

*/

função init(){

// Carrega a API de configurações

$this->init_form_fields();

$this->init_settings();

// Salve as configurações no admin se você tiver alguma definida

add_action( 'woocommerce_update_options_shipping_' . $this->id, array( $this, 'process_admin_options' ) );

}


/**

* Definir campo de configurações para este envio

* @return nulo

*/

function init_form_fields() {

// Vamos adicionar nossas configurações aqui

}

/**
* Esta função é usada para calcular o custo de envio. Dentro desta função, podemos verificar pesos, dimensões e outros parâmetros.
*
* @acesso público
* @param mixed $package
 @return nulo
*/

função pública calcular_envio($pacote) {


// Vamos adicionar o custo, taxa e lógica aqui

}

}

}

}


add_action( 'woocommerce_shipping_init', 'njengahplus_shipping_method' );

function add_njengahplus_shipping_method( $methods ) {

$methods[] = 'NjengahPlus_Shipping_Method';
return $métodos;
}

add_filter( 'woocommerce_shipping_methods', 'add_njengahplus_shipping_method' );

}

Como funciona

  • Primeiro verificamos se a constante WPINC está definida. Se não estiver definido, significa que alguém está tentando acessar este arquivo diretamente ou de um local que não seja o WordPress.
  • Então precisamos verificar se o WooCommerce está ativo. Aqui estamos verificando se o woocommerce.php está no array de plugins ativos que estão salvos no banco de dados na opção active_plugins.
  • woocommerce_shipping_init é a ação principal do WooCommerce Shipping, que inclui todas as classes de envio antes de serem instanciadas. O uso dessa ação garantirá que nosso método de envio seja incluído após a inicialização do WooCommerce e no lugar certo para o WooCommerce usá-lo.
  • O método __construct define alguns atributos gerais e alguns deles podem ser facilmente substituídos após as configurações serem carregadas do banco de dados no método init.
  • Os outros métodos são deixados em branco porque os definiremos posteriormente no tutorial.

Então você precisa ir para ativar o plugin usando as etapas mostradas abaixo:

  1. Faça login no seu site WordPress e acesse o Dashboard como usuário administrador.
  2. No menu Dashboard, clique em Plugins e ative o envio do Njengah conforme mostrado abaixo: ativando o plug-in
  3. Depois de ativar o plug-in, vá para WooCommerce> Configurações . Clique na aba WooCommerce e depois clique em NjengahPlus shipping . Você deve ser capaz de ver isso: Resultado para o primeiro código

b) Definir a disponibilidade do país

A forma de envio que criamos está disponível apenas na lista de países previamente determinada.

  1. Adicione isso no método __construct :
 <?php

//...

$this->method_description = __( 'Método de envio personalizado para NjengahPlus', 'njengahplus' );

// Disponibilidade e Países

$this->disponibilidade = 'incluindo';

$this->países = array(

'EUA', // Estados Unidos da América

'CA', // Canadá

'DE', // Alemanha

'GB', // Reino Unido

'TI', // Itália

'ES', // Espanha

'RH' // Quênia

);

$this->init();

//...

Como o código funciona

O atributo de disponibilidade está definido como 'incluindo' para que este envio esteja disponível apenas para os países no atributo de países.

O WooCommerce verificará se o país de envio está incluído no atributo países.

Criando as configurações

Você precisa simplesmente copiar este código e preencher nosso método init_form_fields:

 <?php



function init_form_fields() {

$this->form_fields = array(

'habilitado' => array(

'title' => __( 'Ativar', 'njengahplus' ),

'tipo' => 'caixa de seleção',

'description' => __( 'Habilitar este envio.', 'njengahplus' ),

'padrão' => 'sim'

),


'título' => array(

'título' => __( 'Título', 'njengahplus' ),

'tipo' => 'texto',

'description' => __( 'Título a ser exibido no site', 'njengahplus' ),

'default' => __( 'NjengahPlus Frete', 'njengahplus' )

),


);


}

Para verificar o resultado, siga estas etapas:

  1. Faça login no seu site WordPress e acesse o Dashboard como usuário administrador No menu Dashboard, clique em WooCommerce > Configurações
  2. Clique na guia Envio e clique em Envio NjengahPlus conforme mostrado abaixo: Njengah mais frete
  3. Ative a caixa de seleção e salve as alterações.

Podemos definir o método de envio para enviar até 100 kg. Em seguida, permitiremos que isso seja editado nas configurações se essa regra mudar em breve. Depois de definir isso, o código de configurações ficará assim:

 <?php




function init_form_fields() {

$this->form_fields = array(

'habilitado' => array(

'title' => __( 'Ativar', 'njengahplus' ),

'tipo' => 'caixa de seleção',

'description' => __( 'Habilitar este envio.', 'njengahplus' ),

'padrão' => 'sim'

),


'título' => array(

'título' => __( 'Título', 'njengahplus' ),

'tipo' => 'texto',

'description' => __( 'Título a ser exibido no site', 'njengahplus' ),

'default' => __( 'NjengahPlus Frete', 'njengahplus' )

),


'peso' => array(

'title' => __( 'Peso (kg)', 'njengahplus' ),

'tipo' => 'número',

'description' => __( 'Peso máximo permitido', 'njengahplus' ),

'padrão' => 100

),


);

}

No código acima, agora definimos o peso máximo nas configurações. Aqui está o Resultado: Peso máximo

c) Calculando o Custo de Envio

Para calcular o custo de envio, atualizaremos o método calculate_shipping uma etapa de cada vez para que você possa entender cada etapa.

  1. Primeiro, precisamos obter o custo por peso . Para fazer isso, basta adicionar este código ao método calculate_shipping:
 <?php

//...

função pública calcular_envio($pacote) {


$peso = 0;

$custo = 0;

$país = $pacote["destino"]["país"];

foreach ( $package['contents'] as $item_id => $values)

{

$_produto = $valores['dados'];

$peso = $peso + $_produto->get_peso() * $valores['quantidade'];

}

$peso = wc_get_weight( $peso, 'kg');

if( $peso <= 10) {

$custo = 0;

} elseif( $peso <= 30 ) {

$custo = 5;


} elseif( $peso <= 50 ) {


$custo = 10;


} senão {

$custo = 20;

}

}
  1. A partir do código acima, temos o custo com base no peso do carrinho, temos que calcular o custo para o país de envio selecionado. Para fazer isso adicione este código:
 <?php


função pública calcular_envio($pacote) {


$countryZones = array(

'HR' => 0,

'EUA' => 3,

'GB' => 2,

'CA' => 3,

'ES' => 2,

'DE' => 1,

'TI' => 1

);


$zonePrices = array(

0 => 10,

1 => 30,

2 => 50,

3 => 70

);


$zoneFromCountry = $countryZones[ $country];

$priceFromZone = $zonePrices[ $zoneFromCountry ];


$custo += $priceFromZone;

}

  1. Calculamos o custo pelo peso total e também adicionamos o custo pelo país de envio. O último passo é adicionar este código para registrar a tarifa.

Como o código funciona

No primeiro snippet desta seção, definimos algumas variáveis ​​iniciais: $weight , $cost e $country . Para obter o total, estamos obtendo o peso total iterando o carrinho e adicionando o peso de cada produto no carrinho à variável $weight .

Depois de ter o peso total, estamos usando a function wc_get_weight para converter o peso em quilogramas, pois esta é a unidade, que nosso método de envio definiu o limite. Então a última coisa foi definir o limite para 100kg.

No segundo snippet, a matriz $countryZones contém as zonas de cada país e a segunda matriz $zonePrices contém os preços de cada zona.

Este será o resultado para a Itália Zona 1: resultado Itália

Este será o resultado para a Zona 2 da Espanha: resultado Espanha

Este será o resultado para a Zona do Canadá:

resultado final

Se você teve dificuldade em implementar este código, aqui está o código completo:

 <?php


função pública calcular_envio($pacote) {

$peso = 0;

$custo = 0;

$país = $pacote["destino"]["país"];

foreach ( $package['contents'] as $item_id => $values)

{

$_produto = $valores['dados'];

$peso = $peso + $_produto->get_peso() * $valores['quantidade'];

}
$peso = wc_get_weight( $peso, 'kg');

if( $peso <= 10) {

$custo = 0;

} elseif( $peso <= 30 ) {

$custo = 5;

} elseif( $peso <= 50 ) {

$custo = 10;

} senão {

$custo = 20;

}

$countryZones = array(

'HR' => 0,

'EUA' => 3,

'GB' => 2,

'CA' => 3,

'ES' => 2,

'DE' => 1,

'TI' => 1

);




$zonePrices = array(

0 => 10,

1 => 30,

2 => 50,

3 => 70

);


$zoneFromCountry = $countryZones[ $country];

$priceFromZone = $zonePrices[ $zoneFromCountry ];

$custo += $priceFromZone;

$taxa = array(

'id' => $this->id,

'label' => $this->título,

'custo' => $custo

);

$this->add_rate( $taxa);

}

Conclusão

Neste post, criamos um plugin personalizado para adicionar um método de envio personalizado no WooCommerce. Além disso, compartilhei com você a API de envio do WooCommerce que permite criar seu método de envio com etapas simples. Além disso, limitações e disponibilidade podem ser definidas dentro do método de envio ao calcular a disponibilidade ou o custo do método de envio. No entanto, eles podem ser definidos fora do método de envio usando as ações do WooCommerce. Espero que este tutorial tenha fornecido uma solução para adicionar um método de envio personalizado no WooCommerce.

Artigos semelhantes