Luc45 / WooCommerce-Correios-Calculo-de-Frete-na-Pagina-do-Produto

Habilita o cálculo de frete na página do produto no WooCommerce.
GNU General Public License v2.0
24 stars 11 forks source link

Frete para múltiplos vendedores #9

Closed lucas-mdiniz closed 5 years ago

lucas-mdiniz commented 5 years ago

Fala Lucas beleza?

Muito obrigado por disponibilizar este plugin!

Estava dando uma olhada no plugin aqui, você acha que existe algum modo de mudar o CEP de origem para o cálculo. Realizando uma integração com outro plugin como o Dokan por exemplo.

(dei uma olhada no código mas não consegui achar onde você pega o CEP de origem)

Abraço!

Luc45 commented 5 years ago

Amigo, experimente fazer o seguinte.

Substitua a seguinte linha: https://github.com/Luc45/WooCommerce-Correios-Calculo-de-Frete-na-Pagina-do-Produto/blob/master/src/Shipping/Payload.php#L74

Por:

$instance->postcode = apply_filters('cfpp_destination_postcode', $destination_postcode);

E crie um arquivo no seguinte local com o seguinte conteúdo: wp-content/mu-plugins/qualquer-coisa.php

add_filter('cfpp_destination_postcode', function() {
    return 1234; // Aqui você irá inserir o código que irá retornar o CEP desejado.
});

Veja se dá certo. Abraços!

lucas-mdiniz commented 5 years ago

Fiz a alteração e não consegui, após isto coloquei $instance->postcode com um cep constante no Payload.php para checar se eu tinha feito algo errado com o filtro, mas ainda sim não obtive sucesso.

Estou analisando o código para tentar achar uma solução. Se tiver alguma outra solução agradeço.

Muito obrigado de qualquer forma,

Abraços!

lucas-mdiniz commented 5 years ago

A seguinte linha faz referência ao CEP de origem, certo?

https://github.com/Luc45/WooCommerce-Correios-Calculo-de-Frete-na-Pagina-do-Produto/blob/master/src/Shipping/Payload.php#L74

Luc45 commented 5 years ago

Desculpe amigo, confundi! O código que falei acima é para alterar o CEP do destinatário.

O CEP do remetente é mais complicado, pois depende diretamente do WooCommerce Correios. Tente isto:

/**
*   Retorna o CEP de um seller pelo ID
*/
function get_cep_seller($seller_id) {
    $address = get_user_meta($seller_id, 'dokan_profile_settings');
    return $address[0]['address']['zip'];
}

/**
*   Hook para alterar o CEP de origem do WooCommerce Correios
*
*   @param $cep_origem: CEP de origem. Deve ser alterado e retornado.
*   @param $metodo_entrega: correios_pac, correios_sedex, etc
*   @param $woocommerce_shipping_method_id: ID único do método de entrega dentro do WooCommerce
*   @param $carrinho: Um array com todos os itens do carrinho.
*/
function muda_cep_origem( $cep_origem, $metodo_entrega, $woocommerce_shipping_method_id, $carrinho ) {
    if (!empty($carrinho['seller_id']) && is_int($carrinho['seller_id'])) {
        $cep_origem = get_cep_seller($carrinho['seller_id']);
    }
    return $cep_origem;
}
add_filter( 'woocommerce_correios_origin_postcode', 'muda_cep_origem', 10, 4 );
lucas-mdiniz commented 5 years ago

Este código eu vou usar no arquivo do woocommerce correios?

Luc45 commented 5 years ago

É um hook que você vai adicionar no functions.php do seu tema para alterar o funcionamento do woocomerce correios.

On Tue, Jan 15, 2019, 17:41 lucas-mdiniz <notifications@github.com wrote:

Este código eu vou usar no arquivo do woocommerce correios?

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/Luc45/WooCommerce-Correios-Calculo-de-Frete-na-Pagina-do-Produto/issues/9#issuecomment-454524153, or mute the thread https://github.com/notifications/unsubscribe-auth/AI6K9ptYCXT6hknK6Df_pRJcRybBWMY-ks5vDi8BgaJpZM4aBYb0 .

lucas-mdiniz commented 5 years ago

O filtro que foi adicionado:

add_filter( 'woocommerce_correios_origin_postcode', 'muda_cep_origem', 10, 4 );

deve ser chamado em algum lugar no woocommerce correios?

Não obtive sucesso com o hook.

Obrigado desde já pela disposição em ajudar!

lucas-mdiniz commented 5 years ago

Bom dia Lucas, beleza?

percebi que o 'woocommerce_correios_origin_postcode' é um hook do próprio plugin do woocommerce correios que já é aplicado no plugin. No carrinho o frete passou a ser calculado para o cep de origem do vendedor, mas na página de produto continua não calculando.

Vou seguir tentando achar o motivo e qualquer coisa mando aqui.

Obrigado!

lucas-mdiniz commented 5 years ago

Fala Lucas Beleza, encontrei a solução.

O problema era que a variável $carrinho quando na página de produto não encontrava a ID do seller, então precisei fazer alguns ajustes para obter o ID do seller na página de produtos.

Obrigado pela ajuda amigo, caso alguém mais precise vou deixar a alteração que fiz na função do hook aqui.

/**
*   Retorna o CEP de um seller pelo ID
*/
function get_cep_seller($seller_id) {
    $address = get_user_meta($seller_id, 'dokan_profile_settings');
    return $address[0]['address']['zip'];
}

/**
*   Hook para alterar o CEP de origem do WooCommerce Correios
*
*   @param $cep_origem: CEP de origem. Deve ser alterado e retornado.
*   @param $metodo_entrega: correios_pac, correios_sedex, etc
*   @param $woocommerce_shipping_method_id: ID único do método de entrega dentro do WooCommerce
*   @param $carrinho: Um array com todos os itens do carrinho.
*/
function muda_cep_origem( $cep_origem, $metodo_entrega, $woocommerce_shipping_method_id, $carrinho ) {
    if (!empty($carrinho['seller_id']) && is_int($carrinho['seller_id'])) {
        $cep_origem = get_cep_seller($carrinho['seller_id']);
    } else {
    $id_produto = key($carrinho['contents']);
    $id_vendedor = get_post($id_produto);
    $cep_origem = get_cep_seller($id_vendedor->post_author);
    }
    return $cep_origem;
}
add_filter( 'woocommerce_correios_origin_postcode', 'muda_cep_origem', 10, 4 );

Abraço!

webmastertesco commented 5 years ago

Pessoal, consegui o código do WCFM Marketplace (http://wclovers.com) para CEP com origem no vendedor. Implementei ele no código acima mas não funciona. O Log de erro diz erro -2, ou seja, não tem CEP de origem. Talvez o código acima tenha uma falha. Segue: function get_cep_seller( $seller_id ) { $vendor_data = get_user_meta( $seller_id, 'wcfmmp_profile_settings', true ); $zip = isset( $vendor_data['address']['zip'] ) ? $vendor_data['address']['zip'] : ''; return $zip; }

Se alguém conseguir implementar, por favor poste. Abcs

laedsonfln commented 5 years ago

@webmastertesco você conseguiu implementar este rook no WCFM Marketplace? Onde devo colocar o hook para ele funcionar? Obrigado.

webmastertesco commented 5 years ago

@laedsonfln Esse codigo deve ser colocado no arquivo functions.php do tema. O problema é se o tema for atualizado , voce perde as alterações anteriores. Sugiro que deixe no diretorio um arquivo original do tema, a alteração e uma copia da alteração. Se fosse plugin não teria problema. Quanto ao funcionamento, não consegui implementar pois quando se calcula o frete com essa implementação, volta o campo em branco no cep do vendedor. Então, tem algum erro na programação que deve ser verificado por quem montou o plugin ou alguem que conheça melhor o woocommerce. Sabendo de alguma coisa, eu postarei.

AdrianoFG84 commented 5 years ago

Fala Lucas Beleza, encontrei a solução.

O problema era que a variável $carrinho quando na página de produto não encontrava a ID do seller, então precisei fazer alguns ajustes para obter o ID do seller na página de produtos.

Obrigado pela ajuda amigo, caso alguém mais precise vou deixar a alteração que fiz na função do hook aqui.

/**
*   Retorna o CEP de um seller pelo ID
*/
function get_cep_seller($seller_id) {
    $address = get_user_meta($seller_id, 'dokan_profile_settings');
    return $address[0]['address']['zip'];
}

/**
*   Hook para alterar o CEP de origem do WooCommerce Correios
*
*   @param $cep_origem: CEP de origem. Deve ser alterado e retornado.
*   @param $metodo_entrega: correios_pac, correios_sedex, etc
*   @param $woocommerce_shipping_method_id: ID único do método de entrega dentro do WooCommerce
*   @param $carrinho: Um array com todos os itens do carrinho.
*/
function muda_cep_origem( $cep_origem, $metodo_entrega, $woocommerce_shipping_method_id, $carrinho ) {
    if (!empty($carrinho['seller_id']) && is_int($carrinho['seller_id'])) {
        $cep_origem = get_cep_seller($carrinho['seller_id']);
    } else {
  $id_produto = key($carrinho['contents']);
  $id_vendedor = get_post($id_produto);
  $cep_origem = get_cep_seller($id_vendedor->post_author);
    }
    return $cep_origem;
}
add_filter( 'woocommerce_correios_origin_postcode', 'muda_cep_origem', 10, 4 );

Abraço!

Boa noite, estou iniciando em Wordpress, mas conheço um pouco de php, gostaria de saber se esse codigo eu tenho que criar ele em um novo arquivo php, e chamar ele no function, ou se tenho que colar esse codigo em algum arquivo existente?

lucas-mdiniz commented 5 years ago

Esse código deve ser inserido no functions.php. É sempre indicado utilizar um tema filho, caso contrário quando você realizar alguma atualização no seu tema você irá perder as alterações.

laedsonfln commented 5 years ago

@lucas-mdiniz gostaria de saber se consegue fazer o mesmo com o plugin do WCFM. Nosso amigo @webmastertesco encontrou os códigos porém está dando erro. Veja:


Pessoal, consegui o código do WCFM Marketplace (http://wclovers.com) para CEP com origem no vendedor. Implementei ele no código acima mas não funciona. O Log de erro diz erro -2, ou seja, não tem CEP de origem. Talvez o código acima tenha uma falha. Segue: function get_cep_seller( $seller_id ) { $vendor_data = get_user_meta( $seller_id, 'wcfmmp_profile_settings', true ); $zip = isset( $vendor_data['address']['zip'] ) ? $vendor_data['address']['zip'] : ''; return $zip; }

Se alguém conseguir implementar, por favor poste. Abcs

Você consegue ver onde pode estar errado? Aparentemente os códigos para Dokan e WCFM são similares.

AdrianoFG84 commented 5 years ago

Valeu, muito obrigado. Deu certinho, agora vou ver como que faço pra poder calcular o frete com medidas padrao quando o vendedor nao informar as medidas.

Em Seg, 12 de ago de 2019 11:04, lucas-mdiniz notifications@github.com escreveu:

Esse código deve ser inserido no functions.php. É sempre indicado utilizar um tema filho, caso contrário quando você realizar alguma atualização no seu tema você irá perder as alterações.

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/Luc45/WooCommerce-Correios-Calculo-de-Frete-na-Pagina-do-Produto/issues/9?email_source=notifications&email_token=AM33WADNMWJUDSGG3JCOUKLQEFUXJA5CNFSM4GQFQ32KYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOD4CUGRA#issuecomment-520438596, or mute the thread https://github.com/notifications/unsubscribe-auth/AM33WAGUT5DMPLWDMCB7U6TQEFUXJANCNFSM4GQFQ32A .

lucas-mdiniz commented 5 years ago

@lucas-mdiniz gostaria de saber se consegue fazer o mesmo com o plugin do WCFM. Nosso amigo @webmastertesco encontrou os códigos porém está dando erro. Veja:

Pessoal, consegui o código do WCFM Marketplace (http://wclovers.com) para CEP com origem no vendedor. Implementei ele no código acima mas não funciona. O Log de erro diz erro -2, ou seja, não tem CEP de origem. Talvez o código acima tenha uma falha. Segue: function get_cep_seller( $seller_id ) { $vendor_data = get_user_meta( $seller_id, 'wcfmmp_profile_settings', true ); $zip = isset( $vendor_data['address']['zip'] ) ? $vendor_data['address']['zip'] : ''; return $zip; }

Se alguém conseguir implementar, por favor poste. Abcs

Você consegue ver onde pode estar errado? Aparentemente os códigos para Dokan e WCFM são similares.

Cara, eu precisaria ter o WCFM rodando aqui pra testar. Eu estou meio sem tempo esses dias mas provavelmente o objeto que vc vai receber aqui:

$vendor_data = get_user_meta( $seller_id, 'wcfmmp_profile_settings', true );

Vai ser diferente do objeto quando se usa o Dokan. Se você perceber, pro Dokan, eu faço assim pra acessar o cep:

$zip = isset( $vendor_data['address']['zip'] ) ? $vendor_data['address']['zip'] : '';

onde $vendor_data['adress']['zip'] é o meu CEP, talvez para o WCFM o cep não esteja dentro de ["adress"].

Exiba as variáveis na tela com var_dump(); e provavelmente você vai conseguir encontrar o caminho

laedsonfln commented 5 years ago

@lucas-mdiniz gostaria de saber se consegue fazer o mesmo com o plugin do WCFM. Nosso amigo @webmastertesco encontrou os códigos porém está dando erro. Veja: Pessoal, consegui o código do WCFM Marketplace (http://wclovers.com) para CEP com origem no vendedor. Implementei ele no código acima mas não funciona. O Log de erro diz erro -2, ou seja, não tem CEP de origem. Talvez o código acima tenha uma falha. Segue: function get_cep_seller( $seller_id ) { $vendor_data = get_user_meta( $seller_id, 'wcfmmp_profile_settings', true ); $zip = isset( $vendor_data['address']['zip'] ) ? $vendor_data['address']['zip'] : ''; return $zip; }

Se alguém conseguir implementar, por favor poste. Abcs

Você consegue ver onde pode estar errado? Aparentemente os códigos para Dokan e WCFM são similares.

Cara, eu precisaria ter o WCFM rodando aqui pra testar. Eu estou meio sem tempo esses dias mas provavelmente o objeto que vc vai receber aqui:

$vendor_data = get_user_meta( $seller_id, 'wcfmmp_profile_settings', true );

Vai ser diferente do objeto quando se usa o Dokan. Se você perceber, pro Dokan, eu faço assim pra acessar o cep:

$zip = isset( $vendor_data['address']['zip'] ) ? $vendor_data['address']['zip'] : '';

onde $vendor_data['adress']['zip'] é o meu CEP, talvez para o WCFM o cep não esteja dentro de ["adress"].

Exiba as variáveis na tela com var_dump(); e provavelmente você vai conseguir encontrar o caminho

@lucas-mdiniz muito obrigado pela resposta! Estou iniciando ainda no PHP e não sei onde faço esse código para exibir as variáveis. Se você me orientar onde devo executar o var_dump(); eu tento encontrar a variável que está dando errado. Por acaso devo colar o código dentro do functions.php? Se sim, onde aparecerá as variáveis?

Obrigado!

lucas-mdiniz commented 5 years ago

Desculpe a demora para responder. Caso ainda não tenha resolvido, coloque o var_dump() como no exemplo:

`function get_cep_seller( $seller_id ) { $vendor_data = get_user_meta( $seller_id, 'wcfmmp_profile_settings', true );

var_dump($vendor_data); exit();

$zip = isset( $vendor_data['address']['zip'] ) ? $vendor_data['address']['zip'] : ''; return $zip; }`

No codigo acima, quando você tentar calcular o fretr, verá o que está na variavel $vendor_data. Lembrando quebo exit(); irá interromper a execuçao do resto do código.

Desculpe a má formatação, estou respondendo do celular.

laedsonfln commented 5 years ago

Desculpe a demora para responder. Caso ainda não tenha resolvido, coloque o var_dump() como no exemplo:

`function get_cep_seller( $seller_id ) { $vendor_data = get_user_meta( $seller_id, 'wcfmmp_profile_settings', true );

var_dump($vendor_data); exit();

$zip = isset( $vendor_data['address']['zip'] ) ? $vendor_data['address']['zip'] : ''; return $zip; }`

No codigo acima, quando você tentar calcular o fretr, verá o que está na variavel $vendor_data. Lembrando quebo exit(); irá interromper a execuçao do resto do código.

Desculpe a má formatação, estou respondendo do celular.

Muiuto obrigado por responder. Colei o código no function.php e tentei simular um frete, daí voltei lá no function e não apareceu o que está dentro do $vendor_data. Não houve mudança. Talvez estou executando no lugar errado?

lucas-mdiniz commented 5 years ago

Tente colocar o seguinte código no functions php, o valor da variável irá aparecer na própria página, após a tentativa de cálculo do frete.

/**
*   Retorna o CEP de um seller pelo ID
*/
function get_cep_seller($seller_id) {

  $vendor_data = get_user_meta( $seller_id, 'wcfmmp_profile_settings', true );

  var_dump($vendor_data);
  exit();

  $zip = isset( $vendor_data['address']['zip'] ) ? $vendor_data['address']['zip'] : '';
  return $zip;
}

/**
*   Hook para alterar o CEP de origem do WooCommerce Correios
*
*   @param $cep_origem: CEP de origem. Deve ser alterado e retornado.
*   @param $metodo_entrega: correios_pac, correios_sedex, etc
*   @param $woocommerce_shipping_method_id: ID único do método de entrega dentro do WooCommerce
*   @param $carrinho: Um array com todos os itens do carrinho.
*/
function muda_cep_origem( $cep_origem, $metodo_entrega, $woocommerce_shipping_method_id, $carrinho ) {
    if (!empty($carrinho['seller_id']) && is_int($carrinho['seller_id'])) {
        $cep_origem = get_cep_seller($carrinho['seller_id']);
    } else {
    $id_produto = key($carrinho['contents']);
    $id_vendedor = get_post($id_produto);
    $cep_origem = get_cep_seller($id_vendedor->post_author);
    }
    return $cep_origem;
}
add_filter( 'woocommerce_correios_origin_postcode', 'muda_cep_origem', 10, 4 );
adrianofreires commented 3 years ago

Fala Lucas Beleza, encontrei a solução.

O problema era que a variável $carrinho quando na página de produto não encontrava a ID do seller, então precisei fazer alguns ajustes para obter o ID do seller na página de produtos.

Obrigado pela ajuda amigo, caso alguém mais precise vou deixar a alteração que fiz na função do hook aqui.

/**
*   Retorna o CEP de um seller pelo ID
*/
function get_cep_seller($seller_id) {
    $address = get_user_meta($seller_id, 'dokan_profile_settings');
    return $address[0]['address']['zip'];
}

/**
*   Hook para alterar o CEP de origem do WooCommerce Correios
*
*   @param $cep_origem: CEP de origem. Deve ser alterado e retornado.
*   @param $metodo_entrega: correios_pac, correios_sedex, etc
*   @param $woocommerce_shipping_method_id: ID único do método de entrega dentro do WooCommerce
*   @param $carrinho: Um array com todos os itens do carrinho.
*/
function muda_cep_origem( $cep_origem, $metodo_entrega, $woocommerce_shipping_method_id, $carrinho ) {
    if (!empty($carrinho['seller_id']) && is_int($carrinho['seller_id'])) {
        $cep_origem = get_cep_seller($carrinho['seller_id']);
    } else {
  $id_produto = key($carrinho['contents']);
  $id_vendedor = get_post($id_produto);
  $cep_origem = get_cep_seller($id_vendedor->post_author);
    }
    return $cep_origem;
}
add_filter( 'woocommerce_correios_origin_postcode', 'muda_cep_origem', 10, 4 );

Abraço!

Basta eu colocar esse código no meu functions.php do tema filho? Eu tentei e não deu certo. Preciso ter algum outro plugin instalado além do Dokan e WooCommerce Correios - Cálculo de Frete na Página do Produto (CFPP) e Claudio Sanches - Correio para Woocommerce?

lucas-mdiniz commented 3 years ago

Fala @adrianofreires beleza?

É só colocar no functions.php do tema filho sim, mas faz muito tempo que encontrei essa solução e o projeto onde usava ela foi descontinuado, possivelmente algo pode ter mudado, talvez até o proprio filter woocommerce_correios_origin_postcode, ou esta função pra obter o endereço do usuário get_user_meta($seller_id, 'dokan_profile_settings');. O ideal seria debugar pra ver onde está o problema ou criar uma nova solução utilizando esta como base.

danielbgjv commented 2 years ago

Fala @adrianofreires beleza?

É só colocar no functions.php do tema filho sim, mas faz muito tempo que encontrei essa solução e o projeto onde usava ela foi descontinuado, possivelmente algo pode ter mudado, talvez até o proprio filter woocommerce_correios_origin_postcode, ou esta função pra obter o endereço do usuário get_user_meta($seller_id, 'dokan_profile_settings');. O ideal seria debugar pra ver onde está o problema ou criar uma nova solução utilizando esta como base.

Lucas, tudo bom? Cara, seu código ficou perfeito, dá certo até hoje!

Eu tenho uma dúvida! Eu preciso que na página do vendedor dokan tenha um campo para inserir o código de rastreamento dos Correios. Essa opção só aparece via WpAdmin >> Woocommerce >> Pedidos. Ou seja, eu precisaria de um código para pegar o código de rastreamento que o vendedor coloca no dashboard e jogar lá no tracking code dos Correios. É muito difícil fazer isso? duvida

No painel do vendedor tem a opção do código de rastreamento do Dokan, mas o plugin dos Correios não pega esse código.

cineijunior commented 2 years ago

Será que da para fazer essa mesma coisa com o plugin da Frenet?

https://frenetapi.docs.apiary.io/# https://github.com/FrenetGatewaydeFretes https://github.com/FrenetGatewaydeFretes/woo-shipping-gateway

thedygoncalves commented 1 year ago

Tente colocar o seguinte código no functions php, o valor da variável irá aparecer na própria página, após a tentativa de cálculo do frete.

/**
*   Retorna o CEP de um seller pelo ID
*/
function get_cep_seller($seller_id) {

  $vendor_data = get_user_meta( $seller_id, 'wcfmmp_profile_settings', true );

  var_dump($vendor_data);
  exit();

  $zip = isset( $vendor_data['address']['zip'] ) ? $vendor_data['address']['zip'] : '';
  return $zip;
}

/**
*   Hook para alterar o CEP de origem do WooCommerce Correios
*
*   @param $cep_origem: CEP de origem. Deve ser alterado e retornado.
*   @param $metodo_entrega: correios_pac, correios_sedex, etc
*   @param $woocommerce_shipping_method_id: ID único do método de entrega dentro do WooCommerce
*   @param $carrinho: Um array com todos os itens do carrinho.
*/
function muda_cep_origem( $cep_origem, $metodo_entrega, $woocommerce_shipping_method_id, $carrinho ) {
    if (!empty($carrinho['seller_id']) && is_int($carrinho['seller_id'])) {
        $cep_origem = get_cep_seller($carrinho['seller_id']);
    } else {
  $id_produto = key($carrinho['contents']);
  $id_vendedor = get_post($id_produto);
  $cep_origem = get_cep_seller($id_vendedor->post_author);
    }
    return $cep_origem;
}
add_filter( 'woocommerce_correios_origin_postcode', 'muda_cep_origem', 10, 4 );

Lucas blza? cara to usando o Woocomerce com WCFM e preciso o mesmo que vc..... Que os produtos sejam calculados os fretes a partir do cep do Vendedor, Tentei esse codigo com o plugin Snippets mas não funcionou.... Voce conseguiu?? Obrigado