Suporte » Ajustando o WordPress » Erro no Woocommerce ao tentar criar um plugin de frete personalizado

  • Estou tentando desenvolver um plugin de cálculo de frete personalizado no Woocommerce, no entanto, não estou conseguindo retornar o cep digitado pelo cliente no carrinho para ativar minhas fórmulas.

    Neste exemplo, coloquei apenas uma fórmula básica para testar, mas está causando o erro “Fatal error: Call to undefined method Test_Shipping_Br::get_items_needing_shipping() in …\wp-content\plugins\woocommerce\includes\class-wc-cart.php on line 1316” quando vou para o carrinho após adicionar um produto.

    Preciso pegar o cep que o cliente digitou e as informações do pacote no carrinho (quantidade, peso, altura, largura, comprimento) e com base nessas informações vou desenvolver uma fórmula específica. Eu comecei uma fórmula básica apenas tentando obter o cep, mas ele já causou o erro que relatei acima.

    Código do plugin (Ele deveria retornar o valor de R$ 17 se o cep do cliente estiver entre 75960000 e 75969999) :

    <?php
    /*
    Plugin Name: Test Shipping
    Plugin URI: 
    Description: 
    Version: 1.0.0
    Author: Wendell Christian
    Author URI: 
    */
    
    if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
    
    function Test_Shipping_Br_init() {
    if ( ! class_exists( 'Test_Shipping_Br' ) ) {
        class Test_Shipping_Br extends WC_Shipping_Method {
    
            public function __construct() {
                $this->id                 = 'Test_Shipping_Br'; 
                $this->method_title       = __( 'Test Shipping Brazil' );  
                $this->method_description = __( '' ); 
    
                $this->enabled            = "yes"; 
                $this->title              = "Test Shipping Brazil"; 
    
                $this->init();
            }
    
            function init() {
                $this->init_form_fields();
                $this->init_settings();
    
                add_action( 'woocommerce_update_options_shipping_' . $this->id, array( $this, 'process_admin_options' ) );
            }
    
            public function calculate_shipping( $package ) {
    
                $array = WC_Cart::get_shipping_packages();                  
                $postcode = $array[0]['destination']['postcode'];
    
                if ($postcode >= 75960000 && $postcode <= 75969999)
                {
                    $cost = 17;
    
                }
    
                $rate = array(
                    'id' => $this->id,
                    'label' => $this->title,
                    'cost' => round($cost,2),
                    'calc_tax' => 'per_order'
                );
    
                $this->add_rate( $rate );
            }
        }
    }
    }
    
    add_action( 'woocommerce_shipping_init', 'Test_Shipping_Br_init' );
    
    function add_Test_Shipping_Br( $methods ) {
        $methods[] = 'Test_Shipping_Br';
        return $methods;
    }
    
    add_filter( 'woocommerce_shipping_methods', 'add_Test_Shipping_Br' );
    }
    • Este tópico foi modificado 4 anos, 9 meses atrás por Claudio Sanches. Motivo: Movendo para "Ajustando o WordPress"
Visualizando 11 respostas - 1 até 11 (de um total de 11)
  • Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Olá, tudo bem?

    Não conferi o código todo, mas get_items_needing_shipping parece ser um método do carrinho (WC_Cart) e não da classe de shipping.

    Comparando com a documentação parece estar tudo OK.

    Se deixar como no exemplo da documentação (sem a sua implementação do CEP), o erro acontece?

    Abraços,

    Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Reparei agora que em add_Test_Shipping_Br você não está colocando seu ID como chave da array:

    
    function add_Test_Shipping_Br( $methods ) {		
        $methods[] = 'Test_Shipping_Br';		
        return $methods;		
    }
    

    Mas deveria ser:

    
    function add_Test_Shipping_Br( $methods ) {		
        $methods['Test_Shipping_Br'] = 'Test_Shipping_Br';		
        return $methods;		
    }
    

    Veja se resolve, por favor.

    Criador do tópico Wendell Christian

    (@wendell_chrys)

    Obrigado pela resposta Mário,
    Não deu certo, continuou o mesmo erro. Eu não estou conseguindo encontrar na documentação a maneira correta de chamar o cep que foi digitado pelo cliente.

    Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Calma. A solução era para o erro que aparecia.

    O erro foi resolvido? A gente passa a pensar no CEP daqui a pouco.

    Criador do tópico Wendell Christian

    (@wendell_chrys)

    Esqueci de informar, o erro mudou para: “Fatal error: Call to undefined method Test_Shipping_Br::get_items_needing_shipping() in …\wp-content\plugins\woocommerce\includes\class-wc-cart.php on line 1316

    Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Estranho… não consigo achar relação com o código do plugin do frete.

    Se deixar o código igual ao da documentação, o erro acontece?

    Criador do tópico Wendell Christian

    (@wendell_chrys)

    Se eu substituir :

    $array = WC_Cart::get_shipping_packages();                  
    $postcode = $array[0]['destination']['postcode'];
    
    if ($postcode >= 75960000 && $postcode <= 75969999)
        {
            $cost = 17;
        }

    Por:

    $cost = 17;

    Fazendo isso erro não acontece, por isso mencionei que o erro deve estar acontecendo com o método que estou usando para capturar o cep.

    Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Tenta pegar o postcode direto do package passado pela função:

    
    public function calculate_shipping( $package ) {
        $postcode = $package['destination']['postcode'];
    
        // ...
    } 
    
    Criador do tópico Wendell Christian

    (@wendell_chrys)

    Alterei o código e ativei o depurador do WordPress, está apresentando o seguinte erro:

    Strict Standards: Declaration of Test_Shipping_Br::calculate_shipping() should be compatible with WC_Shipping_Method::calculate_shipping($package = Array) in ...\wp-content\plugins\test-shipping\test-shipping.php on line 18

    Prezado Wendell!
    Boa noite!
    Tudo bem?
    Jovem, como anda o seu projeto de Frete Personalizado?
    Estou em busca de ajuda e conteúdos para desenvolver um também.
    Você teria algum conteúdo para compartilhar comigo referente ao seu projeto?
    O plugin que preciso tem que:
    * Calcular a distância entre o ponto A e o ponto B pelo CEP;
    * Consulta essa distância em uma array ou arquivo externo para saber em qual faixa ele se encontra.
    Por exemplo:
    De 01km a 100km = 2,19/kg
    De 101 a 200km = 1,67/kg

    Assim sucessivamente.
    * Com o valor do KG, eu tenho que multiplicar pelo peso total no carrinho de compras do cliente e assim obter o valor do frete.
    .
    Conseguiu entender?
    .
    Se puder me ajudar ficarei muito grato.
    .
    Desde já, agradeço pela atenção.

    • Esta resposta foi modificada 4 anos, 6 meses atrás por brunhenk.
    Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Olá Wendell.
    Tudo bem? Desculpe não ter respondido.

    Provavelmente já resolveu, mas caso alguém caia aqui no post: esse erro ocorre porque a declaração do método calculate_shipping tem que ser igual ao da “classe pai”.

    Pela doc:
    public function calculate_shipping( $package )

    Mas fui olhar na classe e o certo é:
    public function calculate_shipping( $package = array() )

    Abraços

Visualizando 11 respostas - 1 até 11 (de um total de 11)
  • O tópico ‘Erro no Woocommerce ao tentar criar um plugin de frete personalizado’ está fechado para novas respostas.