• Resolved rproenca

    (@rproenca)


    Olá @claudiosanches,

    Eu n?o sei como chama isso, se é filtro/hook ou outra coisa rsrsrs mas gostaria de ajuda com o código abaixo.

    Eu tenho código customizado no meu site que torna o PAC grátis nas compras acima de determinado valor (fa?o isso usando o plugin dos Correios ao invés de usar o recurso do frete grátis para que eu possa ter o prazo de entrega informado ao cliente). Sempre funcionou. Mas após atualizar para a nova vers?o, mesmo colocando o “instance_id” correspondente ao novo método de entrega criado, o valor zerado n?o é aplicado no valor do frete para o novo método de entrega. Penso que talvez como temos o Correios (Legacy) e o Correios (nova API) talvez o “woocommerce_correios_correios-pac_rate” tem um novo nome para o novo método?

    O código é o seguinte:

    /* torna o PAC grátis para compras acima de R$199  Todo o BR e Sudeste */
    function custom_pac_gratis( $arr, $instance_id ) {
            $cart_subtotal = WC()->cart->cart_contents_total;
    
            if ( ( 1 === $instance_id && 199 <= $cart_subtotal ) || ( 18 === $instance_id && 199 <= $cart_subtotal ) || ( 28 === $instance_id && 199 <= $cart_subtotal ) || ( 31 === $instance_id && 199 <= $cart_subtotal ) ) {
                    $arr['cost'] = 0;
            }
    
    	return $arr;
    }
    add_filter( 'woocommerce_correios_correios-pac_rate', 'custom_pac_gratis', 10, 2 );

    As instance_id 1 e 18 s?o LEGACY e as 28 e 31 s?o nova API. Todas est?o ativas no site por enquanto, mas somente as 1 e 18 aplica o valor zerado e as 28 e 31 n?o. Talvez o filtro tenha que ser diferente com outro nome? Se sim, qual seria?

    Obrigado

Viewing 13 replies - 1 through 13 (of 13 total)
  • Plugin Author Claudio Sanches

    (@claudiosanches)

    Nesse caso pode usar o filtro woocommerce_correios_cws_rate para o método novo.

    Fala @claudiosanches eu comentei anteriormente aqui, mas por algum motivo meu post sumiu. Basicamente informei a mesma necessidade e elogiei o teu trabalho, por estar todo esse tempo mantendo os plugins woocommerce, acompanho a bastante tempo boa parte deles e é impressionante ver o qu?o rápido você consegue entregar as solu??es.

    Tentei o utilizar esse filtro em quest?o, ele até existe, porém n?o consegui realizar nenhuma a??o dentro dele, parece que a fun??o passada n?o está sendo aplicada. Mesmo código que o @rproenca informou, mudando apenas o nome que você informou.

    Plugin Author Claudio Sanches

    (@claudiosanches)

    @rmachado1eu testei o filtro woocommerce_correios_cws_rate antes de publicar aqui mais cedo e ele esta funcionando sem problema.

    Geralmente quando tópico some assim s?o os admins do fórum, talvez tinha algo de errado com o tópico criado.

    Thread Starter rproenca

    (@rproenca)

    @claudiosanches muito obrigado pela informa??o! Hoje à tarde vou tentar implementar a altera??o. Se der certo, @rmachado1, compartilho aqui como ficou o código.

    Além de deixar PAC grátis acima de determinado valor, tenho outras regras que usam o mesmo filtro, como por exemplo para dar desconto no sedex a partir de determinado valor, dar uma op??o de frete com taxa fixa para alguns estados, etc. Achando o que funcionará para um, a mesma altera??o resolverá para todos.

    • This reply was modified 1 year, 2 months ago by rproenca.
    Thread Starter rproenca

    (@rproenca)

    Olá @claudiosanches,

    Implementei aqui conforme sua orienta??o mas ainda assim n?o consigo mudar o valor do frete.

    Os códigos est?o assim (Legacy e Nova API):

    /* torna o PAC grátis para compras acima de R$199 LEGACY */
    function custom_pac_gratis( $arr, $instance_id ) {
            $cart_subtotal = WC()->cart->cart_contents_total;
    
            if ( ( 1 === $instance_id && 199 <= $cart_subtotal ) || ( 18 === $instance_id && 199 <= $cart_subtotal ) || ( 20 === $instance_id && 199 <= $cart_subtotal ) ) {
                    $arr['cost'] = 0;
            }
    
           	return $arr;
    }
    add_filter( 'woocommerce_correios_correios-pac_rate', 'custom_pac_gratis', 10, 2 );
    
    /* torna o PAC grátis para compras acima de R$199 NOVA API CORREIOS*/
    function custom_pac_gratis_novaapi( $arr, $instance_id ) {
            $cart_subtotal = WC()->cart->cart_contents_total;
    
            if ( ( 27 === $instance_id && 199 <= $cart_subtotal ) || ( 28 === $instance_id && 199 <= $cart_subtotal ) || ( 31 === $instance_id && 199 <= $cart_subtotal ) ) {
                    $arr['cost'] = 0;
            }
    
            return $arr;
    }
    add_filter( 'woocommerce_correios_cws_rate', 'custom_pac_gratis_novaapi', 10, 2 );

    O primeiro, para os métodos LEGACY está funcionando. O segundo n?o.

    Qualquer ajuda é muito apreciada.

    Plugin Author Claudio Sanches

    (@claudiosanches)

    Ent?o, o segundo n?o funciona porque o filtro novo tem mais parametros que o antigo e você esta esperando o mesmo resultados. Você esta usando o ID da classe do método de entrega, ele no caso vai retornar quase sempre correios-cws como ID. Entretanto o que você quer é o instance_id, que seria o terceiro parametro desse filtro.

    Aqui um exemplo de como deveria ser (aproveitei pra adicionar doc block para explicar os paramentos):

    /**
     * Conditional free Correios PAC.
     * 
     * @param array  $rate        Shipping rate.
     * @param string $id          Shipping method class ID.
     * @param int    $instance_id Shipping method instance ID. 
     */
    function custom_pac_gratis_novaapi( $rate, $id, $instance_id ) {
        $cart_subtotal = WC()->cart->cart_contents_total;
    
        if ( ( 27 === $instance_id && 199 <= $cart_subtotal ) || ( 28 === $instance_id && 199 <= $cart_subtotal ) || ( 31 === $instance_id && 199 <= $cart_subtotal ) ) {
            $rate['cost'] = 0;
        }
    
        return $rate;
    }
    add_filter( 'woocommerce_correios_cws_rate', 'custom_pac_gratis_novaapi', 10, 3 );

    Alias, aqui uma vers?o melhorada do seu código, criei uma variável chamada $methods para listar o ID dos métodos e assim facilitar a leitura:

    /**
     * Conditional free Correios PAC.
     * 
     * @param array  $rate        Shipping rate.
     * @param string $id          Shipping method class ID.
     * @param int    $instance_id Shipping method instance ID. 
     */
    function custom_pac_gratis_novaapi( $rate, $id, $instance_id ) {
        $cart_subtotal = WC()->cart->cart_contents_total;
        $methods       = array( 27, 28, 31 );
    
        if ( 199 <= $cart_subtotal && in_array( $instance_id, $methods, true ) ) {
            $rate['cost'] = 0;
        }
    
        return $rate;
    }
    add_filter( 'woocommerce_correios_cws_rate', 'custom_pac_gratis_novaapi', 10, 3 );

    Espero que isso ajude.

    Plugin Author Claudio Sanches

    (@claudiosanches)

    Aproveitando o assunto, aqui um outro exemplo de como usar o label para determinar se é um PAC e dar desconto e mudando o label retornado para “PAC (Frete grátis)”:

    /**
     * Conditional free Correios PAC.
     * 
     * @param array $rate Shipping rate.
     */
    function custom_pac_gratis_novaapi( $rate ) {
        $cart_subtotal = WC()->cart->cart_contents_total;
        $label         = strtolower( $rate['label'] );
    
        if ( 199 <= $cart_subtotal && false !== strpos( $label, 'pac' ) ) {
            $rate['cost'] = 0;
            $rate['label'] .= ' (Frete grátis)';
        }
    
        return $rate;
    }
    add_filter( 'woocommerce_correios_cws_rate', 'custom_pac_gratis_novaapi', 10 );

    Se estiver usando o PHP 8, você pode trocar o strpos() por str_contains().

    Thread Starter rproenca

    (@rproenca)

    Obrigado pelo retorno @claudiosanches,

    Obrigado pela corre??o e melhoria do código. Já atualizei aqui e funcionou perfeitamente. Vou tentar adaptar os outros snippets seguindo esse modelo.

    Quanto ao label “frete grátis” o código que eu já tinha aqui em um snippet separado já funcionou para os novos métodos também sem necessidade de mudan?a no código.

    Obrigado @claudiosanches, de fato consigo agora definir frete grátis para o PAC, usando o mesmo código que você compartilhou.

    Porém tem um outro caso que n?o consegui identificar como resolver. Anteriormente eu utilizava os filtros especificamente em cada um dos métodos, de forma que eu consegui dar frete grátis no Sedex, caso n?o existisse PAC por exemplo.

    O suporte em quest?o já está resolvido, no entanto acredito que seja sobre o mesmo assunto.

    Como consigo identificar o custo de um outro métod por exemplo se já foi concedido o frete grátis no PAC? ou existe de fato um hook pra cada?

    Tentei algo do tipo woocommerce_correios_correios-cws39_rate e n?o tive sucesso.
    Avaliando o chosen_shipping_method vi que era esse o id em quest?o, visto que o instance id é 39.
    Me baseei no que eu achei no código do plugin:
    ‘woocommerce_correios_’ . $this->id . ‘_rate’

    Sem sucesso também.

    Agrade?o se conseguir me dar uma ideia.

    Plugin Author Claudio Sanches

    (@claudiosanches)

    Olá, @rmachado1.

    Como consigo identificar o custo de um outro métod por exemplo se já foi concedido o frete grátis no PAC? ou existe de fato um hook pra cada?

    No caso vai sempre usar o mesmo filtro que é o woocommerce_correios_cws_rate, você pode adicionar uma fun??o apenas para dar frete grátis e tratar cada método.

    Para determinar conforme o nome que você adicionou para o método de entrega, você poderia usar um código assim:

    /**
     * Conditional Correios shipping rate.
     * 
     * @param array $rate Shipping rate.
     */
    function custom_correios_shipping_rate( $rate ) {
        $cart_subtotal = WC()->cart->cart_contents_total;
        $label         = trim( strtolower( $rate['label'] ) );
    
        switch ( $label ) {
            case 'pac':
                if ( 199 <= $cart_subtotal ) {
                    $rate['cost'] = 0;
                    $rate['label'] .= ' (Frete grátis)';
                }
                break;
            case 'sedex':
                // Seu código para sedex normal.
                break;
            case 'sedex 10':
                // Seu código para sedex 10.
                break;
        }
    
        return $rate;
    }
    add_filter( 'woocommerce_correios_cws_rate', 'custom_correios_shipping_rate', 10 );

    @claudiosanches agrade?o pelo retorno. Na verdade n?o seria bem isso, vou te dar um exemplo pra ficar mais fácil de visualizar.

    Temos casos em que n?o há PAC disponível para certas regi?es, principalmente algumas de SP, e somente para esses casos, concedíamos o frete grátis no SEDEX, n?o havendo o PAC disponível e também condicionado ao valor, de 300 reais.

    Ent?o monitorava o hook do PAC, se entrasse, eu removia o “add_filter” do frete grátis do SEDEX, fazendo com que o frete grátis se aplicasse apenas no PAC. Caso contrário, se fosse apenas SEDEX, n?o entrava no hook do PAC e o desconto era aplicado normalmente no SEDEX.

    Por isso questionei uma forma de enquanto estiver no woocommerce_correios_cws_rate do SEDEX, conseguir validar se existe o PAC e n?o dar o desconto nele.

    Plugin Author Claudio Sanches

    (@claudiosanches)

    Mas pra isso que você quer da para fazer com filtro direto no WooCommerce, nem precisa usar filtros deste plugin, usando com do WooCommerce até permite te adicionar um método novo para isso e outras coisas.

    Thread Starter rproenca

    (@rproenca)

    @rmachado1 eu tenho um cenário igual a esse que você descreveu. Estamos em Curitiba e aqui a entrega local só tem a op??o do SEDEX, ent?o peguei a faixa de CEPs onde isso se aplica que criei uma área de Entrega dentro do WooCommerce, informando esses CEPs, aí adicionei somente o método de entrega SEDEX usando o plugin dos Correios e por fim adicionei o instance_id desse método de entrega na lista do código de frete grátis.

    Eu já uso assim há anos e sempre funcionou, agora com a nova API apenas tive que atualizar o código depois de re-adicionar o método de entrega na área de entrega.

    Acho que é isso que o @claudiosanches está sugerindo você fazer também.

Viewing 13 replies - 1 through 13 (of 13 total)
  • The topic ‘Novo nome dos hooks/filtros’ is closed to new replies.