Étendez Linsei avec votre propre code (sans toucher au cœur) grâce au système de hooks. Guide complet avec un exemple qui marche.
Une extension est un dossier dans plugins/ avec un fichier plugin.php. Linsei la charge seule au démarrage. Votre code s'« accroche » à des points précis du programme (les hooks) pour ajouter des fonctions, sans modifier le cœur. Ainsi votre extension survit aux mises à jour de Linsei.
plugins/
└─ mon-extension/
└─ plugin.phpChaque plugin.php commence par cette ligne de sécurité (elle empêche l'exécution directe) :
<?php if(!defined("PL_APP")){http_response_code(403);exit;}
/* Extension : Ma première extension */
pl_add_action('dashboard_after', function ($isAdmin) {
echo '<div class="card">Bonjour depuis mon extension !</div>';
});Copiez ce dossier dans plugins/ et, en rechargeant le panneau, vous verrez votre carte. C'est tout : vous avez une extension.
Deux façons de s'accrocher :
pl_add_action) : exécutent votre code à un moment donné (p. ex. afficher quelque chose dans le panneau).pl_add_filter) : reçoivent une valeur, la transforment et la renvoient (p. ex. changer l'URL de destination).// Action : faire quelque chose
pl_add_action('link_created', function ($slug, $url) {
// p. ex. notifier un webhook
});
// Filtre : transformer une valeur (toujours la renvoyer)
pl_add_filter('link_destination', function ($url) {
return $url; // ici vous pourriez modifier l'URL
});| Hook | Type | Quand | Arguments |
|---|---|---|---|
init | action | à chaque requête | - |
admin_menu | action | au rendu du menu latéral | $user |
dashboard_after | action | à la fin du tableau de bord | $isAdmin |
links_toolbar | action | barre de boutons des Liens | - |
link_form_fields | action | dans le formulaire de lien | $link |
link_row_actions | action | actions de chaque ligne | $link |
help_after | action | à la fin de l'Aide | - |
link_created | action | à la création d'un lien | $slug, $url |
link_saved | action | à l'enregistrement | $id, $post |
link_clicked | action | à chaque clic | $link |
link_destination | filtre | transforme la destination | $url |
link_redirect | filtre | décide la redirection | $decision, $link, $ctx |
redirect_interstitial | filtre | HTML avant de rediriger | $html, $link, $target, $ctx |
pl_add_plugin_menu(titre, url, icône, route) vous ajoutez une entrée au menu, et dans init vous gérez cette route. Les icônes viennent de Bootstrap Icons.Cette extension colore chaque lien de la liste selon ses clics : rouge si peu de visites, ambre si moyen et vert si beaucoup. Ajustez $peu et $beaucoup :
<?php if(!defined("PL_APP")){http_response_code(403);exit;}
/* Extension : Feu de visites */
pl_add_action('link_row_actions', function ($link) {
$clics = (int)($link['click_count'] ?? 0);
$peu = 10; // moins de 10 clics : rouge
$beaucoup = 100; // plus de 100 clics : vert
if ($clics < $peu) { $color = '#dc2626'; } // rouge
elseif ($clics > $beaucoup) { $color = '#16a34a'; } // vert
else { $color = '#f59e0b'; } // ambre
echo '<span style="background:' . $color . ';color:#fff;'
. 'border-radius:999px;padding:1px 8px;font-size:.75rem">'
. $clics . '</span>';
});Pour ne pas coder les nombres en dur, lisez-les depuis le magasin de réglages (celui que le cœur utilise pour le SMTP) avec pl_app_setting() et donnez à l'extension sa propre page où l'administrateur les modifie :
<?php if(!defined("PL_APP")){http_response_code(403);exit;}
/* Extension : feu tricolore configurable */
// 1) Dans le feu tricolore, lisez les seuils depuis le magasin (avec valeurs par défaut)
$peu = (int) pl_app_setting('semaforo_peu', 10);
$beaucoup = (int) pl_app_setting('semaforo_beaucoup', 100);
// 2) Sur la page de l'extension, enregistrez ce que soumet l'administrateur
if (($_POST['enregistrer'] ?? '') !== '') {
pl_app_settings_save([
'semaforo_peu' => (int)($_POST['peu'] ?? 10),
'semaforo_beaucoup' => (int)($_POST['beaucoup'] ?? 100),
]);
}
// 3) Ajoutez son entrée au menu du panneau (administrateur uniquement)
pl_add_plugin_menu('Feu tricolore', '/admin/feu', 'bi-sliders', '/admin/feu');data/settings.json, via pl_app_setting() et pl_app_settings_save() (le même magasin que le SMTP du cœur). L'administrateur change les seuils sans toucher au code.pl_mon_) pour éviter les conflits.Quand ça marche, compressez le dossier de votre extension en .zip et téléversez-le depuis le panneau :
.zip et il s'installe aussitôt.