Action Hook WHMCS Collezione 2020 aggiornata ogni mese

Action Hook WHMCS Collezione 2020 aggiornata ogni mese

Indietro   Pubblicato 27 aprile 2020 / Aggiornato 2 luglio 2020
Tempo di lettura 21 minuti

Perfeziona il tuo WHMCS

In questo post condividiamo una raccolta di action hook che puoi utilizzare liberamente nel tuo WHMCS. Puoi adattarli alle tue specifiche esigenze oppure utilizzarli come ispirazione per i tuoi progetti. Il post viene aggiornato ogni mese con nuovi hook e miglioramenti.

Disclaimer

Tutti gli action hook mostrati sono stati realizzati da noi nel corso degli anni. La maggior parte di essi sono stati condivisi sul forum di WHMCS. Li rilasciamo gratuitamente "come sono" senza garanzie di alcun tipo. Non è consentito rimuovere il copyright.

Raccolta di Action Hook

Prima di poter iniziare a "giocare" con gli hook, è necessario imparare le basi. Nome suggerisce il nome, un action hook permette l'esecuzione di un codice quando si verificano determinati eventi in WHMCS. In sintesi puoi eseguire un'azione X quando si verifica l'evento Y.

Gli action hook sono scritti in PHP ma il loro utilizzo non si limita né al PHP né al web. Si possono eseguire javascript, jQuery, HTML, CSS, comandi da console ed altro codice. In una certa misura si possono anche utilizzare altri linguaggi di programmazione come Ruby, Python e PowerShell ma non dilunghiamoci.

Per utilizzare gli hook forniti, inizia col creare un file con un nome a piacere (può essere katamazeHooks.php) nella directory includes/hooks ed al suo interno copia il codice dell'hook prescelto. Tieni presente che il file può ospitare più action hook.

È possibile trovare l'elenco completo degli hook point in Hook Index mentre qui in basso trovi risorse utili ad espandere la tua conoscenza del sistema:

Simulare / Eseguire il cron giornaliero di WHMCS a richiesta

Essendo sviluppatori in WHMCS, abbiamo spesso l'esigenza di poter eseguire il cron giornaliero ogni volta che vogliamo. In tal modo possiamo testare velocemente le nuove funzioni e fare il debug dei problemi.

Il problema è che, come suggerisce il nome, il cron job giornaliero si esegue solo una volta al giorno. Per poterlo eseguire più volte, si deve indurre WHMCS a pensare che il cron non sia ancora stato eseguito.

Questo può essere fatto modificando manualmente specifici valori nel database ma è una cosa abbastanza noiosa pertanto ci è venuta l'idea di integrare la funzionalità in un pulsante che appare in cima all'amministrazione.

Puoi osservare il pulsante nell'immagine sopra (è quello arancione). Ignora i pulsanti Reinstall e Manage Demo, questi li utilizziamo per le Live Demo dei nostri moduli. Dopo aver aggiunto l'hook, potrai eseguire il cron giornaliero più volte semplicemente cliccando sul pulsante Run Daily Cronjob.

<?

/**
 * Simulate / Run WHMCS Daily Cron Job on demand
 *
 * @package     WHMCS
 * @copyright   Katamaze
 * @link        https://katamaze.com
 * @author      Davide Mantenuto <[email protected]>
 */

use WHMCS\Database\Capsule;

add_hook('AdminAreaHeaderOutput', 1, function($vars)
{
if ($_GET['simulatecron'])
{
$SystemURL = Capsule::table('tblconfiguration')->where('setting', 'SystemURL')->first(['value'])->value;
Capsule::table('tblconfiguration')->where('setting', 'lastDailyCronInvocationTime')->update(['value' => '']);
Capsule::table('tblconfiguration')->where('setting', 'DailyCronExecutionHour')->update(['value' => date('H')]);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $SystemURL . 'crons/cron.php');
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
curl_close($ch);
}

return <<<HTML


HTML;
});

Accettare preventivo senza bisogno di login

L'hook permette ai clienti di accettare il preventivo senza effettuare l'accesso. L'hook sovrascrive il {$quote_link} predefinito di WHMCS un attimo prima che l'email Quote Delivery with PDF venga inviata. Il nuovo link contiene un hash che assicura l'autenticità della richiesta. Quando il visitatore lo clicca, il preventivo viene accettato mentre si apre il tuo sito che mostra il seguente messaggio.

<?

/**
* Accept Quote without Logging In
*
* @package WHMCS
* @copyright Katamaze
* @link https://katamaze.com
* @author Davide Mantenuto <[email protected]>
*
*/

use WHMCS\Database\Capsule;

add_hook('EmailPreSend', 1, function($vars)
{
if (in_array($vars['messagename'], array('Quote Delivery with PDF')))
{
if ($vars['mergefields']['quote_link'])
{
$data = Capsule::select(Capsule::raw('SELECT t1.id, t2.id AS clientid, t2.email FROM tblquotes AS t1 LEFT JOIN tblclients AS t2 ON t1.userid = t2.id WHERE t1.id = "' . $vars['mergefields']['quote_number'] . '" LIMIT 1'))[0];
$hash = strrev(md5($data->id . $data->clientid . $data->email)) . '-' . $data->id;
$quote_link = (new SimpleXMLElement($vars['mergefields']['quote_link']))['href'];
$url = parse_url($quote_link);
$merge_fields['quote_link'] = str_replace($quote_link, $url['scheme'] . '://' . $url['host'] . '/index.php?qhash=' . $hash, $vars['mergefields']['quote_link']);

return $merge_fields;
}
}
});

add_hook('ClientAreaHeadOutput', 1, function($vars)
{
if ($_GET['qhash'])
{
$data = Capsule::select(Capsule::raw('SELECT t1.id, t1.subject, t2.id AS clientid, t2.firstname, t2.email FROM tblquotes AS t1 LEFT JOIN tblclients AS t2 ON t1.userid = t2.id WHERE t1.id = "' . explode('-', $_GET['qhash'])[1] . '" AND stage != "Accepted" LIMIT 1'))[0];
$hash = strrev(md5($data->id . $data->clientid . $data->email)) . '-' . $data->id;

if ($hash === $_GET['qhash'])
{
$adminUsername = ''; // Optional for WHMCS 7.2 and later
$results = localAPI('AcceptQuote', array('quoteid' => $data->id), $adminUsername);

return <<<HTML
<script>
setTimeout(function()
{
$("#modalAjax .modal-title").html('Quote #{$data->id} Accepted');
$("#modalAjax .modal-body").html('<div class="container col-md-12"><div class="row"><div class="col-md-8"><h4>Hey, {$data->firstname}</h4><p>Thanks for accepting quote <strong>#{$data->id}</strong> ({$data->subject}). Here is what happens now:<ul><li>You will receive the invoice shortly</li><li>Once we receive your payment, we\'ll activate your order</li></ul>Please do not hesitate to <a href="contact.php"><strong>contact us</strong></a> if you have any questions.</p></div><div class="col-md-4 text-center"><p><a href="cart.php"><i class="fas fa-cart-plus fa-5x"></i></a></p><p><small>Keep browsing our Products</small></p><p><a href="cart.php" class="btn btn-info btn-block">Discover</a></p></div></div></div>');
$('#modalAjax .loader').hide();
$('#modalAjax .modal-submit').hide();
$("#modalAjax").modal('show');
}, 250);
</script>
HTML;
}
}
});

Auto-ricalcolo massivo su domini e prodotti/servizi cliente

A volte si rende necessario effettuare il ricalcolo dei prezzi dei domini e dei prodotti/servizi di uno specifico cliente. WHMCS non ha una funzione del genere. L'unica possibilità è selezionare il checkbox "Auto Recalculate on Save" e premere Save Changes. Ciò può essere è estremamente noioso e richiedere molto tempo se il cliente ha tanti servizi e domini. Questo hook rende tutto più semplice.

Facendo click su Bulk Auto Recalculate si apre un modale dal quale è possibile eseguire il ricalcolo automatico in un click su tutti i domini e prodotti/servizi come visibile nell'immagine sottostante.

Ecco il codice.

<?

/**
* Bulk Auto Recalculate Client Domain & Products/Services
*
* @package WHMCS
* @copyright Katamaze
* @link https://katamaze.com
* @author Davide Mantenuto <[email protected]>
*
*/

use WHMCS\Database\Capsule;

add_hook('AdminAreaHeaderOutput', 1, function($vars)
{
if ($vars['filename'] == 'clientssummary' AND $_GET['userid'] AND in_array($_GET['kata'], array('bulkAutoRecalculateP', 'bulkAutoRecalculateD')))
{
$adminUsername = ''; // Optional for WHMCS 7.2 and later

if ($_GET['kata'] == 'bulkAutoRecalculateP')
{
foreach(Capsule::table('tblhosting')->where('userid', '=', $_GET['userid'])->pluck('id') as $v)
{
localAPI('UpdateClientProduct', array('serviceid' => $v, 'autorecalc' => true), $adminUsername);
}

header('Location: clientssummary.php?userid=' . $_GET['userid']);
die();
}
elseif ($_GET['kata'] == 'bulkAutoRecalculateD')
{
foreach (Capsule::table('tbldomains')->where('userid', '=', $_GET['userid'])->pluck('id') as $v)
{
localAPI('UpdateClientDomain', array('domainid' => $v, 'autorecalc' => true), $adminUsername);
}

header('Location: clientssummary.php?userid=' . $_GET['userid']);
die();
}
}

return <<<HTML
<script>
$(document).ready(function(){
$('[href*="affiliates.php?action=edit&id="], [href*="clientssummary.php?userid="][href*="&activateaffiliate=true&token="]').closest('li').after(('<li><a href="#" id="kata_BulkAutoRecalculate"><i class="fas fa-fw fa-sliders-h" style="width:16px;text-align:center;"></i> Bulk Auto Recalculate</a></li>'));
$('#kata_BulkAutoRecalculate').on('click', function(e){
e.preventDefault();
$('#modalAjaxTitle').html('Bulk Auto Recalculate');
$('#modalAjaxBody').html('<div class="container col-md-12"><div class="row"><div class="col-md-6 text-center"><div class="panel panel-default"><div class="panel-body"><p><i class="fas fa-box fa-5x"></i></p><p><small>Auto Recalculate Customer\'s <strong>Products/Services</strong></small></p><p><a href="clientssummary.php?userid={$_GET['userid']}&kata=bulkAutoRecalculateP" class="btn btn-info btn-block">Recalculate Now »</a></p></div></div></div><div class="col-md-6 text-center"><div class="panel panel-default"><div class="panel-body"><p><i class="fas fa-globe fa-5x"></i></p><p><small>Auto Recalculate Customer\'s <strong>Domains</strong></small></p><p><a href="clientssummary.php?userid={$_GET['userid']}&kata=bulkAutoRecalculateD" class="btn btn-info btn-block">Recalculate Now »</a></p></div></div></div></div></div>');
$('#modalAjax .modal-submit').addClass('hidden');
$('#modalAjaxLoader').hide();
$('#modalAjax .modal-dialog').addClass('modal-lg');
$('#modalAjax').modal('show');
})
})
</script>
HTML;
});

Password sicure per l'auto-setup

Il seguente hook sovrascrive la password predefinita generata da WHMCS per il setup dei servizi in pannelli di terze parti come Plesk, cPanel, DirectAdmin e i moduli server personalizzati. Il codice si attiva un attimo prima che WHMCS esegua il Module Create.

<?

/**
 * Stronger Password Generator for WHMCS Provisioning
 *
 * @package     WHMCS
 * @copyright   Katamaze
 * @link        https://katamaze.com
 * @author      Davide Mantenuto <[email protected]>
 */

use WHMCS\Database\Capsule;

add_hook('PreModuleCreate', 1, function($vars)
{
    $password = substr(str_shuffle('[email protected]#$%^&*()-=+?'), 0, $length = '10');
    Capsule::table('tblhosting')->where('id', $vars['params']['serviceid'])->update(['password' => Encrypt($password)]);
});

In basso c'è una versione migliorata che impone la presenza di un carattere speciale nella password.

<?

/**
 * Stronger Password Generator for WHMCS Provisioning v2
 *
 * @package     WHMCS
 * @copyright   Katamaze
 * @link        https://katamaze.com
 * @author      Davide Mantenuto <[email protected]>
 */

use WHMCS\Database\Capsule;

add_hook('PreModuleCreate', 1, function($vars)
{
    $chars              = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $specialChars       = '[email protected]#$%^&*?'; // Plesk does not consider (, ), -, = and + as special characters
    $password           = substr(str_shuffle($chars), 0, $length = '9');
    $randomPos          = rand(0, strlen($password) - 1);
    $randomSpecialChar  = $specialChars[rand(0,strlen($specialChars)-1)];
    $password           = substr($password, 0, $randomPos) . $randomSpecialChar . substr($password, $randomPos);

    Capsule::table('tblhosting')->where('id', $vars['params']['serviceid'])->update(['password' => Encrypt($password)]);
});

Per password ancora più sicure, utilizza questa terza versione dove è possibile indicare quanti numeri, maiuscole, minuscole e caratteri speciali devono essere utilizzate. In aggiunta la password risultante non utilizzerà uno stesso carattere più di una volta.

<?

/**
 * Stronger Password Generator for WHMCS Provisioning v3
 *
 * @package     WHMCS
 * @copyright   Katamaze
 * @link        https://katamaze.com
 * @author      Davide Mantenuto <[email protected]>
 */

use WHMCS\Database\Capsule;

add_hook('PreModuleCreate', 1, function($vars)
{
    $length['digit']    = '3'; // Number of digits in password
    $length['lower']    = '4'; // Number of UNIQUE lowercase characters in password
    $length['upper']    = '4'; // Number of UNIQUE uppercase characters in password
    $length['special']  = '2'; // Number of special characters in password

    // The same character cannot be used more than once (case sensitive)
    if ($length['lower'] + $length['upper'] == '26')
    {
        $length['lower'] = '13';
        $length['upper'] = '13';
    }

    $digits             = '0123456789';
    $chars              = 'abcdefghijklmnopqrstuvwxyz';
    $special            = '[email protected]#$%^&*?'; // Plesk does not consider (, ), -, = and + as special characters
    $digits             = substr(str_shuffle($digits), 0, $length['digit']);
    $lower              = substr(str_shuffle($chars), 0, $length['lower']);
    $upper              = substr(str_shuffle(strtoupper( str_replace(str_split($lower), '', $chars) )), 0, $length['lower']);
    $special            = substr(str_shuffle($special), 0, $length['special']);
    $password           = str_shuffle($digits . $lower . $upper . $special);

    Capsule::table('tblhosting')->where('id', $vars['params']['serviceid'])->update(['password' => Encrypt($password)]);
});

Nuovi clienti come affiliati

Imposta automaticamente i nuovi clienti come affiliati senza bisogno che lo facciano manualmente.

<?

/**
 * Set New Clients as Affiliates
 *
 * @package     WHMCS
 * @copyright   Katamaze
 * @link        https://katamaze.com
 * @author      Davide Mantenuto <[email protected]>
 */

add_hook('ClientAreaRegister', 1, function($vars)
{
    $adminUsername = 'ADMIN_USERNAME'; // Optional for WHMCS 7.2 and later
    $results = localAPI('AffiliateActivate', array('userid' => $vars['userid']), $adminUsername);
});

Ciò detto, come probabilmente già saprai il sistema di affiliazione di WHMCS è molto rudimentale. Se hai bisogno di qualcosa di più completo, dai uno sguardo a Commission Manager.

Invia email & aggiungi risposta al cambio status del Ticket

Quando lo status di un ticket cambia, WHMCS non invia alcuna notifica ciononostante è possibile migliorare questo aspetta con il seguente hook che invia un'email al cliente ed aggiunge anche una risposta automatica al ticket stesso. In questo modo si possono guidare i clienti attraverso il processo di elaborazione dei ticket.

<?

/**
 * Send Email & Add Reply on Ticket status change
 *
 * @package     WHMCS
 * @copyright   Katamaze
 * @link        https://katamaze.com
 * @author      Davide Mantenuto <[email protected]>
 */

use WHMCS\Database\Capsule;

add_hook('TicketStatusChange', 1, function($vars)
{
    $adminUsername = 'admin'; // The reply will be added by this Admin user. Set false to open the ticket using your own customer
    $userID = Capsule::table('tbltickets')->where('id', $vars['ticketid'])->first(['userid'])->userid;

    // Email notification
    $EmailData = array(
        'id' => $userID,
        'customtype' => 'general',
        'customsubject' => 'Thank you for contacting us',
        'custommessage' => 'Your ticket status has been changed to ' .$vars['status']
    );

    localAPI('SendEmail', $EmailData);

    // Ticket reply
    $TicketData = array(
        'ticketid' => $vars['ticketid'],
        'message' => 'Your ticket status has been changed to ' .$vars['status'],
        'clientid' => $userID,
        'adminusername' => $adminUsername,
    );

    localAPI('AddTicketReply', $TicketData);
});

Clienti in gruppi in base ai prodotti/servizi acquistati

Assegna automaticamente un cliente ad un gruppo in base al prodotto/servizio appena acquistato. Lo script si attiva nel momento in cui l'ordine viene accettato sia manualmente che automaticamente.

<?

/**
 * Assign Client to Group based on purchased Product/Service
 *
 * @package     WHMCS
 * @copyright   Katamaze
 * @link        https://katamaze.com
 * @author      Davide Mantenuto <[email protected]>
 */

use WHMCS\Database\Capsule;

add_hook('AcceptOrder', 1, function($vars)
{
    $productID  = 12; // Replace with the ID of your Product/Service
    $groupID    = 1; // Replace with the ID of your Client Group
    $userID     = Capsule::table('tblorders')->leftJoin('tblhosting', 'tblorders.id', '=', 'tblhosting.orderid')->where([['tblorders.id', '=', $vars['orderid']], ['tblhosting.packageid', '=', $productID]])->first(['tblorders.userid']);

    if ($userID)
    {
        Capsule::table('tblclients')->where('id', $userID->userid)->update(['groupid' => $groupID]);
    }
});

Blocco modifica Client Custom Field

WHMCS integra una funzione che blocca i campi del profilo per impedire che i clienti possano modificarli dall'area clienti (es. nome azienda, indirizzo). Questa funzione tuttavia non è disponibile per i client custom fields. Se anche si andassero a rendere "disabled" con HTML o jQuery, sarebbe comunque possibile inviare modifiche.

Il seguente hook assicura che nessun cliente possa apportare cambiamenti. Se necessario la protezione si può attivare anche per gli amministratori.

<?

/**
 * Prevent changes to Client Custom Fields
 *
 * @package     WHMCS
 * @copyright   Katamaze
 * @link        https://katamaze.com
 * @author      Davide Mantenuto <[email protected]>
 */

use WHMCS\Database\Capsule;

add_hook('CustomFieldSave', 1, function($vars)
{
    $ReadOnlyFields = array('1', '2'); // IDs of Custom Fields that cannot be edited
    $DisallowAdmin = false; // true = Even Administrators are not allowed to edit | false = Administrators can freely update Custom Fields

    /* Do not edit below */
    $IsAdmin = (basename($_SERVER['PHP_SELF']) == 'clientsprofile.php' ? true : false);

    if (in_array($vars['fieldid'], $ReadOnlyFields) AND (($IsAdmin AND $DisallowAdmin) OR (!$IsAdmin)))
    {
        return array('value' => Capsule::table('tblcustomfieldsvalues')->where(['fieldid' => $vars['fieldid'], 'relid' => $vars['relid']])->first(['value'])->value);
    }
});

Cogliamo l'occasione per renderti noto che Billing Extension può portare il tuo WHMCS a fare un importante passo avanti avendo funzioni come la fatturazione mensile, la fatturazione elettronica, Facebook Pixel e molto altro.

Conversione preventivo in fattura senza redirect

Quando un preventivo viene convertito in fattura, WHMCS ti redindirizza automaticamente alla fattura appena creata. Questo hook fa in modo che WHMCS non esegua il redirect lasciandoti nella pagina del preventivo.

<?

/**
 * Disable redirect when converting Quote to Invoice
 *
 * @package     WHMCS
 * @copyright   Katamaze
 * @link        https://katamaze.com
 * @author      Davide Mantenuto <[email protected]>
 */

use Illuminate\Database\Capsule\Manager as Capsule;

add_hook('InvoiceCreation', 1, function($vars)
{
    $quoteID = Capsule::table('tblinvoices')->where('id', $vars['invoiceid'])->where('notes', 'like', 'Re Quote #%')->first(['notes']);
    header('Location: quotes.php?action=manage&id=' . explode('#', $quoteID->notes)[1]);
    die();
});

Forza il login per tutte le pagine

A volte si ha l'esigenza di creare un WHMCS "chiuso" dove i visitatori non possono visualizzare le pagine prima di aver fatto il login. WHMCS ha una funzione che lo rende quasi possibile. Vai su Setup > General Settings > Others > Default to Client Area. Attivando l'opzione, i visitatori vengono reindirizzati alla pagina di login.

La funzione che abbiamo appena descritto tuttavia permette comunque di accedere ad alcune altre pagine (es. carrello, form di registrazione, contatti, ticket). Utilizza l'hook fornito per limitare ulteriormente l'accesso. La variablie $Exceptions è utilizzabile per mettere in "white-list" determinate pagine.

Rimuovi/Nascondi Breadcrumb

WHMCS antepone alla breadcrumb la voce Portal Home. Non c'è nulla di sbagliato in questo ma nel caso in cui tu voglia rimuoverla da tutte le pagine, utilizza questo hook.

<? 

/**
 * Remove Portal Home breadcrumb
 *
 * @package     WHMCS
 * @copyright   Katamaze
 * @link        https://katamaze.com
 * @author      Davide Mantenuto <[email protected]>
 */

add_hook('ClientAreaPage', 1, function($vars)
{
	unset($vars['breadcrumb'][0]);
	return array('breadcrumb' => $vars['breadcrumb']);
});

In alternativa potresti semplicemente nasconderla con queste righe di CSS. In tal modo i motori di ricerca possono comunque ancora "vedere" la breadcrumb completa.

.breadcrumb li:first-child {
    display:none;
}
.breadcrumb li:nth-child(2):before {
    content:" ";
}

Data aggiornamento Knowledgebase

Supponiamo di voler personalizzare la Knowledgebase in modo che includa la data di ultima modifica degli articoli. Purtoppo WHMCS non memorizza questo valore tuttavia ci è venuta l'idea di ricavare il dato dall'Activity Log. Non è una soluzione elegante ma certamente funziona.

L'action hook fornito in basso aggiunge la relativa variabile Smarty all'array $kbarticle già esistente. Puoi utilizzarlo semplicemente agendo nel template.

<?

/**
 * Knowledgebase Last Updated Date
 *
 * @package     WHMCS
 * @copyright   Katamaze
 * @link        https://katamaze.com
 * @author      Davide Mantenuto <[email protected]>
 */

use WHMCS\Database\Capsule;

add_hook('ClientAreaPageKnowledgebase', 1, function($vars)
{
	if ($vars['kbarticle']['id'])
	{
		$LastUpdated = Capsule::table('tblactivitylog')->where('description', 'like', 'Modified Knowledgebase Article ID: %' . $vars['kbarticle']['id'])->orderby('id', 'desc')->first(['date'])->date;
		$output['kbarticle'] = $vars['kbarticle'];
		$output['kbarticle']['lastupdated']['date'] = date('Y-m-d', strtotime($LastUpdated));
		$output['kbarticle']['lastupdated']['time'] = date('H:i:s', strtotime($LastUpdated));

		return $output;
	}
});

Se hai bisogno di qualcosa di più completo e aggiornato, scopri come migliorare il posizionamento con il SEO in WHMCS.

Tieni anche presente che abbiamo sviluppato un modulo che trasforma WHMCS in un CMS completo che non ha nulla da invidiare a sistemi come WordPress, Joomla e Drupal.

Lingua del Login as Client

Ogni volta che un amministratore usa la funzione Login as Client WHMCS sovrascrive la lingua predefinita per il cliente selezionato sostituendola con quella in uso dall'amministratore nel backend. Ciò è un male perché stai inavvertitamente cambiando la lingua dei clienti ed è vero in particolar modo se non consenti ai clienti di effettuare il cambio della lingua.

Supponiamo che l'area clienti sia impostata in italiano e che utilizzi il backed in inglese. Al login as client WHMCS cambierà la lingua del cliente dall'italiano all'inglese e non c'è modo di tornare indietro. Il cliente in questione resta bloccato su una lingua che non può cambiare. Il seguente hook impedisce che ciò accada.

<?

/**
 * Login as Client Language
 *
 * @package     WHMCS
 * @copyright   Katamaze
 * @link        https://katamaze.com
 * @author      Davide Mantenuto <[email protected]>
 */

add_hook('AdminAreaHeaderOutput', 1, function($vars)
{
if ($vars['filename'] == 'clientssummary' AND $_GET['userid'])
{
return <<<HTML
<script type="text/javascript">
$(document).on('ready', function(){
href = $("#summary-login-as-client").attr('href');
$("#summary-login-as-client").attr('href', href.replace(/&?language=\w+/, ''));
});
</script>
HTML;
}
});

Non inviare email in base al gruppo cliente

Il seguente hook impedisce a WHMCS di inviare email General Messages a specifici gruppi clienti in base ad una sorta di "blacklist".

<?

/**
 * Prevent emails to be send based on Client Group
 *
 * @package     WHMCS
 * @copyright   Katamaze
 * @link        https://katamaze.com
 * @author      Davide Mantenuto <[email protected]>
 */

use WHMCS\Database\Capsule;

add_hook('EmailPreSend', 1, function($vars)
{
$disallowedGroupIDs = array('1', '2'); // Array of Client Group ID to block
$emailTemplates = array('Automated Password Reset', 'Password Reset Validation', 'Password Reset Confirmation'); // Email Templates to block (General Messages)

if (in_array($vars['messagename'], $emailTemplates))
{
if (!Capsule::select(Capsule::raw('SELECT id FROM tblclients WHERE id = "' . $vars['relid'] . '" AND groupid IN (\'' . implode('\',\'', $disallowedGroupIDs) . '\') LIMIT 1')))
{
$output['abortsend'] = true;
return $output;
}
}
});

Annulla setup automatico quando c' una nota nell'ordine

Supponiamo che un cliente ordini una VPS ed aggiunga una nota dove richiede una configurazione particolare che richiede il tuo intervento manuale. Se stai utilizzano l'auto-provisioning, non c'è modo di impedire a WHMCS di creare la VPS per permetterti di intervenire manualmente. Questo hook tuttavia interrompe il setup laddove è presente una nota nell'ordine.

<?

/** * Abort auto-provisioning when there's a note in the order * * @package WHMCS * @copyright Katamaze * @link https://katamaze.com * @author Davide Mantenuto <[email protected]> */

use
WHMCS\Database\Capsule; add_hook('PreModuleCreate', 1, function($vars) { $Data = Capsule::select(Capsule::raw('SELECT t1.notes FROM tblorders AS t1 LEFT JOIN tblhosting AS t2 ON t1.id = t2.orderid WHERE t2.id = "' . $vars['params']['serviceid'] . '" AND t2.orderid != "0"')); if ($Data[0]->notes) { return array('abortcmd' => true); } });

Aggiungere pulsante al fianco delle funzioni modulo

A volte vorresti semplicemente aggiungere un pulsate al fianco delle funzioni Create, Suspend, Unsuspend (...) nella vista del prodotto/servizio. Ecco come fare. Sentiti libero di adattare lo script per integrare la tua funzione PHP/javascript che si attivi alla pressione del tasto.

<?

/**
 * Add button next to module's functions
 *
 * @package     WHMCS
 * @copyright   Katamaze
 * @link        https://katamaze.com
 * @author      Davide Mantenuto <[email protected]>
 */

add_hook
('AdminAreaHeaderOutput', 1, function($vars) { return <<<HTML
<script type="text/javascript">
$(document).ready(function(){
$("#modcmdbtns").append('<button type="button" class="btn btn-danger"><i class="fa fa-shower" aria-hidden="true"></i> Bath Time</button>');
});
</script>
HTML;
});

Meta Description per Announcement

Prima di pensare «Fantastico! Finalmente posso aggiungere i meta description alle news di WHMCS» aspetta un momento e comprendi quanto segue:

  • WHMCS è pessimo nel SEO. Avrai bisogno di molto più che questo hook per riscontrare dei benefici
  • Meta description non è un fattore di ranking. Non ha effetto sul posizionamento ma sul CTR

Puoi utilizzare lo stesso approccio per implementare altri meta tag ma stai alla larga dal meta keywords. È inutile ed è stato deprecato da più di un decennio da tutti i motori di ricerca.

<?

/**
 * Announcements Meta Description
 *
 * @package     WHMCS
 * @copyright   Katamaze
 * @link        https://katamaze.com
 * @author      Davide Mantenuto <[email protected]>
 */

add_hook('ClientAreaHeadOutput', 1, function($vars)
{
if ($vars['templatefile'] == 'viewannouncement')
{
return <<<HTML
<meta name="description" content="{$vars['summary']}">
HTML;
}
});

Codice Coupon in Email Template

L'Invoice Payment Confirmation è un Email Template che WHMCS invia ai clienti al saldo delle fatture. Normalmente il messaggio non riporta alcuna informazione riguardo le promozioni. Il seguente hook include i codici promozionali eventualmente applicati nella fattura.

<?

/** * Promotion Code in Invoice Payment Confirmation * * @package WHMCS * @copyright Katamaze * @link https://katamaze.com * @author Davide Mantenuto <[email protected]> */
use WHMCS\Database\Capsule; add_hook('EmailPreSend', 1, function($vars) { if (in_array($vars['messagename'], array('Invoice Payment Confirmation'))) { $promotions = Capsule::select(Capsule::raw('SELECT description FROM tblinvoiceitems WHERE invoiceid = "' . $vars['relid'] . '" AND type = "PromoHosting"')); foreach ($promotions as $v) { $merge_fields['assigned_promos'][] = $v->description; } return $merge_fields; } });

Per completare l'operazione visita Setup > Email Templates > Invoice Payment Confirmation ed aggiungi il seguente codice:

{if $assigned_promos}
Promo below:
{foreach from=$assigned_promos item=promo}
{$promo}
{/foreach}
{/if}

Ecco il risultato:

Commenti (0)

Dì ciò che pensi Cancella Risposta