No WHMCS, um cliente pode estar vinculado a um ou mais usuários. Quando um cliente é atualizado pela área administrativa ou pela área do cliente, o Hook abaixo garante que as alterações de nome, sobrenome e e-mail também sejam refletidas no usuário principal (owner) vinculado a ele. Atualmente o WHMCS não permite a alteração dos dados do usuário principal pelo cliente.
1. O que o Hook faz?
O código utiliza o hook ClientEdit
, que é executado sempre que os dados de um cliente são atualizados no painel administrativo ou pela área do cliente do WHMCS.
2. Funcionamento
Ao editar um cliente:
- O hook captura os dados alterados (nome, sobrenome e e-mail).
- Em seguida, busca o Usuário Principal (owner) vinculado ao cliente usando a tabela tblusers_clients
.
- Se encontrado, ele atualiza as informações do usuário correspondente na tabela tblusers
para manter ambos sincronizados.
3. Código do Hook
Crie um arquivo chamado sincronizar_usuario.php
e envie para a pasta /includes/hooks
do seu WHMCS com o seguinte conteúdo:
use WHMCS\Database\Capsule;
add_hook('ClientEdit', 1, function($vars) {
$clientId = $vars['userid'];
$newEmail = $vars['email'];
$newFirstName = $vars['firstname'];
$newLastName = $vars['lastname'];
try {
$userLink = Capsule::table('tblusers_clients')
->where('client_id', $clientId)
->where('owner', 1)
->first();
if (!$userLink) return;
$userId = $userLink->auth_user_id;
Capsule::table('tblusers')
->where('id', $userId)
->update([
'email' => $newEmail,
'first_name' => $newFirstName,
'last_name' => $newLastName,
'updated_at' => date('Y-m-d H:i:s'),
]);
} catch (Exception $e) {
logActivity('Erro ao sincronizar dados do usuário principal: ' . $e->getMessage());
}
});
4. Como identificar Clientes com dados diferentes dos Usuários
Para verificar quais clientes possuem informações divergentes do usuário principal, utilize a seguinte consulta SQL via phpMyAdmin no banco de dados do WHMCS:
c.id AS client_id,
c.firstname,
c.lastname,
c.email AS client_email,
u.id AS user_id,
u.first_name AS user_first_name,
u.last_name AS user_last_name,
u.email AS user_email
FROM
tblclients c
INNER JOIN
tblusers_clients uc ON uc.client_id = c.id AND uc.owner = 1
INNER JOIN
tblusers u ON u.id = uc.auth_user_id
WHERE
c.email != u.email
OR c.firstname != u.first_name
OR c.lastname != u.last_name;
Se o resultado retornar linhas, significa que os dados do cliente e do usuário principal estão diferentes. Após ativar o hook, qualquer atualização feita em um cliente irá sincronizar essas informações automaticamente.