• Resolvido f5atualizese

    (@f5atualizese)


    Estou adaptando o Woocommerce para o meu site.
    Todos sabemos que o cliente que efetuar o seu cadastro, a função dele fica como Customer Quero mudar isso, tem como?
    Temos algumas funções antigas no site que estão implantadas em vários arquivos e muitas dessas funções só podem ser executadas, vistas ou gravadas por um tipo de usuário personalizado no site, que no nosso caso é Guerreiro

    Quando o cadastro é efetuado pelo Woocommerce, o cliente não tem acesso a essas funções. O que é um enorme problema.

    Alguém sabe como posso resolver isso?

Visualizando 9 respostas - 1 até 9 (de um total de 9)
  • Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Olá @f5atualizese, tudo bem?

    Acho bem perigoso alterar algo do Core do Woo, principalmente para manter atualizando no futuro.

    Antes de sugerir como corrigir, gostaria de apontar que o mais interessante é sempre checar pelas capacidades (Capabilities) do usuário e não pela função (Role). Por isso o WordPress tem a função current_user_can.

    Mas como fica complicado refatorar todo o seu site, podemos fazer assim: ao criar um usuário com a função Customer iremos tambem adicionar a função Guerreiro.

    Para isso use a ação user_register:

    add_action( 'user_register', 'myplugin_add_warrior_role', 10, 1 );
    
    function myplugin_add_warrior_role( $user_id ) {
    
        $user = get_user_by( 'id', $user_id );
        if ( in_array( 'customer', (array) $user->roles ) ) {
            wp_update_user( array(
                'ID'    => $user_id,
                'role'  => array_push( (array) $user->roles, 'guerreiro' ),
            ) );
        }
    }

    Lembre de trocar customer e guerreiro pelas Roles.

    Criador do tópico f5atualizese

    (@f5atualizese)

    Olá, @mariovalney tudo na boa… Obrigado por responder.

    Entendi, bom se eu puder acrescentar uma segunda função no usuário que faz seu cadastro através do Woocommerce melhor ainda. Essas funções que me referi são todas acessadas pelo Front, páginas personalizadas como, Minha Conta, Sair, opções no menu do topo do site, Favoritar um anúncio que o cliente tenha interesse e etc.

    Bom, enfim.

    Inseri o código no arquivo functions.php do meu tema, mas bugou tudo.

    Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Há alguma mensagem de erro? “Bugou tudo” não é erro.

    Por favor, confira se inseriu o código corretamente. Do jeito que está, ele só irá rodar quando um usuário for registrado, então dificilmente causaria algum problema no site fora desse fluxo.

    No mais, tente trocar para esse, pois dependendo da versão do PHP, talvez não aceite a forma que o anterior foi escrito:

    add_action( 'user_register', 'myplugin_add_warrior_role', 10, 1 );
    
    function myplugin_add_warrior_role( $user_id ) {
    
        $user = get_user_by( 'id', $user_id );
        $roles = (array) $user->roles;
        if ( in_array( 'customer', $roles ) ) {
            wp_update_user( array(
                'ID'    => $user_id,
                'role'  => array_push( $roles, 'guerreiro' ),
            ) );
        }
    }

    Além disso, note que está incluindo um código PHP, então por favor, confira se usou a tag <?php de abertura corretamente.

    Abraços

    Criador do tópico f5atualizese

    (@f5atualizese)

    @mariovalney Desculpe, não especifiquei muito bem. Quando eu tinha colocado o outro código, o site parou de abrir.

    Já esse segundo que você enviou, eu implantei sem problemas no functions.php. Acabei de fazer um teste de novo cadastro do cliente, fazendo o procedimento de compra de um produto por ex onde o cliente é novo no site e ele precisa fazer seu primeiro cadastro.

    Mas a função guerreiro não funcionou, não habilitou as funções deste tipo de usuário.

    Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Bem @f5atualizese, a lógica é essa.

    Como não tenho como debuggar o código, você vai precisar conferir algumas coisas:

    1 – A action (ação) está rodando?
    2 – Ao chegar no código, o usuário já está com a role (função) do WooCommerce?
    3 – O usuário foi atualizado?

    Uma forma de fazer seria adicionar a função de log do PHP assim: https://pastebin.com/Sb9wN62Y

    (Não esqueça de colocar seu e-mail ali no lugar do exemplo)

    Se estiver localmente ou não puder enviar e-mails, basta alterar o log para escrever no arquivo padrão e procurar no seu servidor: https://pastebin.com/4w563jA4

    • Esta resposta foi modificada 7 anos, 6 meses atrás por Mário Valney.
    • Esta resposta foi modificada 7 anos, 6 meses atrás por Mário Valney.
    Criador do tópico f5atualizese

    (@f5atualizese)

    @mariovalney Implantei o código no functions.php e os emails que recebi foram os seguintes:

    Action rodou!

    Entrou no IF

    WP_User Object
    (
        [data] => stdClass Object
            (
                [ID] => 13953
                [user_login] => contato
                [user_pass] => $P$Bf4egKcidphseqIMcTR4CTkr1yu3Fp/
                [user_nicename] => contato
                [user_email] => contato@f5atualizar.com.br
                [user_url] =>
                [user_registered] => 2017-04-19 01:15:35
                [user_activation_key] =>
                [user_status] => 0
                [display_name] => contato
                [spam] => 0
                [deleted] => 0
            )
    
        [ID] => 13953
        [caps] => Array
            (
                [customer] => 1
            )
    
        [cap_key] => wp_capabilities
        [roles] => Array
            (
                [0] => customer
            )
    
        [allcaps] => Array
            (
                [read] => 1
                [plugin_delete_me] => 1
                [customer] => 1
            )
    
        [filter] =>
    )

    Usuário salvo com sucesso: 13953

    Criador do tópico f5atualizese

    (@f5atualizese)

    @mariovalney Me esqueci, no caso deste cadastro, a função do usuário ficou como Nenhuma. Nem Customer e nem Guerreiro.

    Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Bem. Então o problema é no wp_update_user.

    Na documentação, afirma que ‘role’ deveria ser uma string, mas como podemos ter mais de uma ‘role’ imaginei que daria certo. Não é algo trivial, então nunca tentei isso.

    Pois bem, vamos tentar outra abordagem:

    add_action( 'user_register', 'myplugin_add_warrior_role', 10, 1 );
     
    function myplugin_add_warrior_role( $user_id ) {
        $user = get_user_by( 'id', $user_id );
        $roles = (array) $user->roles;
        if ( in_array( 'customer', $roles ) ) {
            $user->add_role( 'guerreiro' );
        }
    }

    Dessa vez, vamos tentar usar o método add_role da classe WP_User.

    Não esqueça de se certificar que está usando a role certa. Ali escrevi ‘guerreiro’ apenas como exemplo.

    • Esta resposta foi modificada 7 anos, 6 meses atrás por Mário Valney.
    • Esta resposta foi modificada 7 anos, 6 meses atrás por Mário Valney.
    Criador do tópico f5atualizese

    (@f5atualizese)

    Olá @mariovalney, boa noite! Só consegui fazer o procedimento agora no meu site.

    Agora deu certo, quando o cliente faz o cadastro no site através do Woo, a função guerreiro é definida no perfil dele, e ele consegue acesso em todas as funções do assinante.

    Obrigado pela ajuda brother, passei um sufoco com isso aqui, agora tem outro BÓ para resolver, vou esperar alguém responder no outro post que fiz rsrs…

    Aliás, você tem conhecimento nessa área?
    Dá uma olhada no link: https://br.wordpress.org/support/topic/woocommerce-formulario-de-atualizacao-de-cadastro/

    Se não tiver, não tem problema. Eu agradeço da mesma forma, já me ajudou pra caramba rs

    Abraços

    • Esta resposta foi modificada 7 anos, 6 meses atrás por f5atualizese. Razão: Inclusão de informações
Visualizando 9 respostas - 1 até 9 (de um total de 9)
  • O tópico ‘Woocommerce – Funções de usuários’ está fechado para novas respostas.