Jump to content

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


Recommended Posts

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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

Do you agree with our terms?