Ir para conteúdo
  • Cadastre-se

Hook - Botão de WhatsApp no painel de admin do WHMCS


Posts Recomendados

Olá pessoal, hoje precisei entrar em contato com alguns clientes pelo whatsapp para passar algumas informações, e é muito chato ter que ficar salvando contato, ou editando o link do whatspp manualmente, então criei esse hook simples que adiciona um botão de WhatsApp na pagina do perfil do cliente no painel de administração do WHMCS, facilitando para entrar em contato com o cliente direto pelo whatsapp, espero que sirva para mais alguém!

O resultado é esse: https://prnt.sc/6qVjouVUSmhQ

A instalação é simples, basta colocar o código em um arquivo php com nome de sua preferência e colocar o arquivo em includes/hooks do seu whmcs

<?php
use WHMCS\Database\Capsule;

// Bloqueia o acesso direto ao arquivo
if (!defined("WHMCS")){
    die("Acesso restrito!");
}

// Pagina de Administrador
add_hook("AdminAreaClientSummaryPage", 1, function($vars){
    // Obtém o ID do cliente da variável $vars
    $clientId = $vars['userid'];
    
    // Busca o número de telefone do cliente na tabela 'tblclients'
    $client = Capsule::table('tblclients')->where('id', $clientId)->first();
    
    // Verifica se o cliente foi encontrado
    if ($client && !empty($client->phonenumber)) {
        // Formata o número de telefone
        $phoneNumber = preg_replace('/\D/', '', $client->phonenumber);
        $whatsappLink = "https://api.whatsapp.com/send?phone=55" . $phoneNumber;

        // Retorna o botão do WhatsApp
        return "<a href='" . $whatsappLink . "' class='btn btn-success' target='_blank'>WhatsApp</a>";
    } else {
        // Caso o número de telefone não esteja disponível, exibe uma mensagem
        return "<a href='#' class='btn btn-default disabled'>WhatsApp (Número não disponível)</a>";
    }
});

 

Qualquer sugestão só falar, comenta se foi útil para você 🙂

Link para o comentário
Compartilhar em outros sites

uma pequena modificação, como só falei com cliente do brasil, deixei pré-definido o código do pais como '55'

nesse código, ele vai puxar do banco de dados o código do pais e preencher corretamente o código no link do whatsapp.

 

<?php
use WHMCS\Database\Capsule;

// Bloqueia o acesso direto ao arquivo
if (!defined("WHMCS")){
    die("Acesso restrito!");
}

// Função para mapear códigos de países
function getCountryCallingCode($countryCode) {
    $countryCallingCodes = [
        'AF' => '93', 'AL' => '355', 'DZ' => '213', 'AS' => '1684', 'AD' => '376',
        'AO' => '244', 'AI' => '1264', 'AQ' => '672', 'AG' => '1268', 'AR' => '54',
        'AM' => '374', 'AW' => '297', 'AU' => '61', 'AT' => '43', 'AZ' => '994',
        'BS' => '1242', 'BH' => '973', 'BD' => '880', 'BB' => '1246', 'BY' => '375',
        'BE' => '32', 'BZ' => '501', 'BJ' => '229', 'BM' => '1441', 'BT' => '975',
        'BO' => '591', 'BA' => '387', 'BW' => '267', 'BR' => '55', 'BN' => '673',
        'BG' => '359', 'BF' => '226', 'BI' => '257', 'KH' => '855', 'CM' => '237',
        'CA' => '1', 'CV' => '238', 'KY' => '1345', 'CF' => '236', 'TD' => '235',
        'CL' => '56', 'CN' => '86', 'CO' => '57', 'KM' => '269', 'CG' => '242',
        'CD' => '243', 'CR' => '506', 'HR' => '385', 'CU' => '53', 'CY' => '357',
        'CZ' => '420', 'DK' => '45', 'DJ' => '253', 'DM' => '1767', 'DO' => '1809',
        'EC' => '593', 'EG' => '20', 'SV' => '503', 'GQ' => '240', 'ER' => '291',
        'EE' => '372', 'SZ' => '268', 'ET' => '251', 'FJ' => '679', 'FI' => '358',
        'FR' => '33', 'GA' => '241', 'GM' => '220', 'GE' => '995', 'DE' => '49',
        'GH' => '233', 'GR' => '30', 'GD' => '1473', 'GU' => '1671', 'GT' => '502',
        'GN' => '224', 'GW' => '245', 'GY' => '592', 'HT' => '509', 'HN' => '504',
        'HK' => '852', 'HU' => '36', 'IS' => '354', 'IN' => '91', 'ID' => '62',
        'IR' => '98', 'IQ' => '964', 'IE' => '353', 'IL' => '972', 'IT' => '39',
        'JM' => '1876', 'JP' => '81', 'JO' => '962', 'KZ' => '7', 'KE' => '254',
        'KI' => '686', 'KP' => '850', 'KR' => '82', 'KW' => '965', 'KG' => '996',
        'LA' => '856', 'LV' => '371', 'LB' => '961', 'LS' => '266', 'LR' => '231',
        'LY' => '218', 'LI' => '423', 'LT' => '370', 'LU' => '352', 'MO' => '853',
        'MK' => '389', 'MG' => '261', 'MW' => '265', 'MY' => '60', 'MV' => '960',
        'ML' => '223', 'MT' => '356', 'MH' => '692', 'MR' => '222', 'MU' => '230',
        'MX' => '52', 'FM' => '691', 'MD' => '373', 'MC' => '377', 'MN' => '976',
        'ME' => '382', 'MA' => '212', 'MZ' => '258', 'MM' => '95', 'NA' => '264',
        'NR' => '674', 'NP' => '977', 'NL' => '31', 'NZ' => '64', 'NI' => '505',
        'NE' => '227', 'NG' => '234', 'NU' => '683', 'NF' => '672', 'MP' => '1670',
        'NO' => '47', 'OM' => '968', 'PK' => '92', 'PW' => '680', 'PS' => '970',
        'PA' => '507', 'PG' => '675', 'PY' => '595', 'PE' => '51', 'PH' => '63',
        'PL' => '48', 'PT' => '351', 'PR' => '1', 'QA' => '974', 'RO' => '40',
        'RU' => '7', 'RW' => '250', 'WS' => '685', 'SM' => '378', 'ST' => '239',
        'SA' => '966', 'SN' => '221', 'RS' => '381', 'SC' => '248', 'SL' => '232',
        'SG' => '65', 'SK' => '421', 'SI' => '386', 'SB' => '677', 'SO' => '252',
        'ZA' => '27', 'SS' => '211', 'ES' => '34', 'LK' => '94', 'SD' => '249',
        'SR' => '597', 'SE' => '46', 'CH' => '41', 'SY' => '963', 'TW' => '886',
        'TJ' => '992', 'TZ' => '255', 'TH' => '66', 'TL' => '670', 'TG' => '228',
        'TO' => '676', 'TT' => '1868', 'TN' => '216', 'TR' => '90', 'TM' => '993',
        'TV' => '688', 'UG' => '256', 'UA' => '380', 'AE' => '971', 'GB' => '44',
        'US' => '1', 'UY' => '598', 'UZ' => '998', 'VU' => '678', 'VE' => '58',
        'VN' => '84', 'YE' => '967', 'ZM' => '260', 'ZW' => '263'
        // Adicione mais códigos conforme necessário
    ];

    return isset($countryCallingCodes[$countryCode]) ? $countryCallingCodes[$countryCode] : '';
}

// Pagina de Administrador
add_hook("AdminAreaClientSummaryPage", 1, function($vars){
    // Obtém o ID do cliente da variável $vars
    $clientId = $vars['userid'];
    
    // Busca o número de telefone e a sigla do país do cliente na tabela 'tblclients'
    $client = Capsule::table('tblclients')->where('id', $clientId)->first(['phonenumber', 'country']);
    
    // Verifica se o cliente foi encontrado
    if ($client && !empty($client->phonenumber) && !empty($client->country)) {
        // Formata o número de telefone
        $phoneNumber = preg_replace('/\D/', '', $client->phonenumber);

        // Obtém o código de discagem do país
        $countryCode = strtoupper($client->country);
        $callingCode = getCountryCallingCode($countryCode);

        // Verifica se o código de discagem do país foi encontrado
        if (!empty($callingCode)) {
            $whatsappLink = "https://api.whatsapp.com/send?phone=" . $callingCode . $phoneNumber;
            // Retorna o botão do WhatsApp
            return "<a href='" . $whatsappLink . "' class='btn btn-success' target='_blank'> WhatsApp</a>";
        } else {
            return "<a href='#' class='btn btn-default disabled'> WhatsApp (Código de país não encontrado)</a>";
        }
    } else {
        // Caso o número de telefone ou a sigla do país não esteja disponível, exibe uma mensagem
        return "<a href='#' class='btn btn-default disabled'> WhatsApp (Informação incompleta)</a>";
    }
});

 

Link para o comentário
Compartilhar em outros sites

Isto só funciona se o cliente tiver cadastrado um celular que seja WhatsApp, certo?

E se o cliente for PJ e tiver cadastrado um fixo (algo muito comum)?

Faço essas perguntas pq eu deixo uma espécie de campo customizado com o título "WhatsApp" justamente para estas situações em que o cliente cadastra o telefone fixo como principal (geralmente é do Depto Financeiro da empresa dele), daí tem este campo adicional para ele preencher o WhatsApp no cadastro (deixo o preenchimento como opcional).

Link para o comentário
Compartilhar em outros sites

28 minutos atrás, Streaming disse:

Isto só funciona se o cliente tiver cadastrado um celular que seja WhatsApp, certo?

E se o cliente for PJ e tiver cadastrado um fixo (algo muito comum)?

Faço essas perguntas pq eu deixo uma espécie de campo customizado com o título "WhatsApp" justamente para estas situações em que o cliente cadastra o telefone fixo como principal (geralmente é do Depto Financeiro da empresa dele), daí tem este campo adicional para ele preencher o WhatsApp no cadastro (deixo o preenchimento como opcional).

Nesse caso, alterei a configuração para puxar a informação do custom Field

Altere somente essa linha para funcionar

$customFieldId = 14; // Altere para o ID do seu custom field
 
para saber o ID do seu custom field pode simplesmente inspecionar elemento no campo do whatsapp na pagina de cadastro do seu site: https://prnt.sc/5vw2xu1LCU0z
 
ou pode olhar direto pelo phpmyadmin na tabela 'tblcustomfields': https://prnt.sc/96_qHHq39WBr
 
<?php
use WHMCS\Database\Capsule;

// Bloqueia o acesso direto ao arquivo
if (!defined("WHMCS")){
    die("Acesso restrito!");
}

// Função para mapear códigos de países
function getCountryCallingCode($countryCode) {
    $countryCallingCodes = [
        'AF' => '93', 'AL' => '355', 'DZ' => '213', 'AS' => '1684', 'AD' => '376',
        'AO' => '244', 'AI' => '1264', 'AQ' => '672', 'AG' => '1268', 'AR' => '54',
        'AM' => '374', 'AW' => '297', 'AU' => '61', 'AT' => '43', 'AZ' => '994',
        'BS' => '1242', 'BH' => '973', 'BD' => '880', 'BB' => '1246', 'BY' => '375',
        'BE' => '32', 'BZ' => '501', 'BJ' => '229', 'BM' => '1441', 'BT' => '975',
        'BO' => '591', 'BA' => '387', 'BW' => '267', 'BR' => '55', 'BN' => '673',
        'BG' => '359', 'BF' => '226', 'BI' => '257', 'KH' => '855', 'CM' => '237',
        'CA' => '1', 'CV' => '238', 'KY' => '1345', 'CF' => '236', 'TD' => '235',
        'CL' => '56', 'CN' => '86', 'CO' => '57', 'KM' => '269', 'CG' => '242',
        'CD' => '243', 'CR' => '506', 'HR' => '385', 'CU' => '53', 'CY' => '357',
        'CZ' => '420', 'DK' => '45', 'DJ' => '253', 'DM' => '1767', 'DO' => '1809',
        'EC' => '593', 'EG' => '20', 'SV' => '503', 'GQ' => '240', 'ER' => '291',
        'EE' => '372', 'SZ' => '268', 'ET' => '251', 'FJ' => '679', 'FI' => '358',
        'FR' => '33', 'GA' => '241', 'GM' => '220', 'GE' => '995', 'DE' => '49',
        'GH' => '233', 'GR' => '30', 'GD' => '1473', 'GU' => '1671', 'GT' => '502',
        'GN' => '224', 'GW' => '245', 'GY' => '592', 'HT' => '509', 'HN' => '504',
        'HK' => '852', 'HU' => '36', 'IS' => '354', 'IN' => '91', 'ID' => '62',
        'IR' => '98', 'IQ' => '964', 'IE' => '353', 'IL' => '972', 'IT' => '39',
        'JM' => '1876', 'JP' => '81', 'JO' => '962', 'KZ' => '7', 'KE' => '254',
        'KI' => '686', 'KP' => '850', 'KR' => '82', 'KW' => '965', 'KG' => '996',
        'LA' => '856', 'LV' => '371', 'LB' => '961', 'LS' => '266', 'LR' => '231',
        'LY' => '218', 'LI' => '423', 'LT' => '370', 'LU' => '352', 'MO' => '853',
        'MK' => '389', 'MG' => '261', 'MW' => '265', 'MY' => '60', 'MV' => '960',
        'ML' => '223', 'MT' => '356', 'MH' => '692', 'MR' => '222', 'MU' => '230',
        'MX' => '52', 'FM' => '691', 'MD' => '373', 'MC' => '377', 'MN' => '976',
        'ME' => '382', 'MA' => '212', 'MZ' => '258', 'MM' => '95', 'NA' => '264',
        'NR' => '674', 'NP' => '977', 'NL' => '31', 'NZ' => '64', 'NI' => '505',
        'NE' => '227', 'NG' => '234', 'NU' => '683', 'NF' => '672', 'MP' => '1670',
        'NO' => '47', 'OM' => '968', 'PK' => '92', 'PW' => '680', 'PS' => '970',
        'PA' => '507', 'PG' => '675', 'PY' => '595', 'PE' => '51', 'PH' => '63',
        'PL' => '48', 'PT' => '351', 'PR' => '1', 'QA' => '974', 'RO' => '40',
        'RU' => '7', 'RW' => '250', 'WS' => '685', 'SM' => '378', 'ST' => '239',
        'SA' => '966', 'SN' => '221', 'RS' => '381', 'SC' => '248', 'SL' => '232',
        'SG' => '65', 'SK' => '421', 'SI' => '386', 'SB' => '677', 'SO' => '252',
        'ZA' => '27', 'SS' => '211', 'ES' => '34', 'LK' => '94', 'SD' => '249',
        'SR' => '597', 'SE' => '46', 'CH' => '41', 'SY' => '963', 'TW' => '886',
        'TJ' => '992', 'TZ' => '255', 'TH' => '66', 'TL' => '670', 'TG' => '228',
        'TO' => '676', 'TT' => '1868', 'TN' => '216', 'TR' => '90', 'TM' => '993',
        'TV' => '688', 'UG' => '256', 'UA' => '380', 'AE' => '971', 'GB' => '44',
        'US' => '1', 'UY' => '598', 'UZ' => '998', 'VU' => '678', 'VE' => '58',
        'VN' => '84', 'YE' => '967', 'ZM' => '260', 'ZW' => '263'
    ];

    return isset($countryCallingCodes[$countryCode]) ? $countryCallingCodes[$countryCode] : '';
}

// Define o ID do custom field para o número de telefone
$customFieldId = 14; // Altere para o ID do seu custom field

// Página de Administrador
add_hook("AdminAreaClientSummaryPage", 1, function($vars) use ($customFieldId) {
    // Obtém o ID do cliente da variável $vars
    $clientId = $vars['userid'];
    
    // Busca a sigla do país do cliente na tabela 'tblclients'
    $client = Capsule::table('tblclients')->where('id', $clientId)->first(['country']);
    
    // Busca o número de telefone no custom field
    $customFieldValue = Capsule::table('tblcustomfieldsvalues')
        ->where('relid', $clientId)
        ->where('fieldid', $customFieldId)
        ->value('value');

    // Verifica se o cliente foi encontrado e se o número de telefone e a sigla do país estão disponíveis
    if ($client && !empty($customFieldValue) && !empty($client->country)) {
        // Remove espaços, pontos, parênteses e hifens do número de telefone
        $phoneNumber = preg_replace('/[\s\.\-\(\)]/', '', $customFieldValue);

        // Obtém o código de discagem do país
        $countryCode = strtoupper($client->country);
        $callingCode = getCountryCallingCode($countryCode);

        // Verifica se o número já contém um código de país
        if (strpos($phoneNumber, '+') === 0) {
            // Remove o sinal de "+" do início
            $phoneNumber = substr($phoneNumber, 1);
        } elseif (strpos($phoneNumber, $callingCode) === 0) {
            // Se o número já começa com o código de país, não adicione novamente
        } else {
            // Adiciona o código de discagem do país no início do número
            $phoneNumber = $callingCode . $phoneNumber;
        }

        // Cria o link do WhatsApp
        $whatsappLink = "https://api.whatsapp.com/send?phone=" . $phoneNumber;
        
        // Retorna o botão do WhatsApp
        return "<a href='" . $whatsappLink . "' class='btn btn-success' target='_blank'> WhatsApp</a>";
    } else {
        // Caso o número de telefone ou a sigla do país não esteja disponível, exibe uma mensagem
        return "<a href='#' class='btn btn-default disabled'> WhatsApp (Informação incompleta)</a>";
    }
});

 

Link para o comentário
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Infelizmente, seu conteúdo contém termos que não são permitimos. Edite seu conteúdo para remover as palavras destacadas abaixo.
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...

Informação Importante

Concorda com os nossos termos?