Add a admin_menubar_plugin_links hook allowing plugins to inject entries into an expandable submenu under the "Plugins" section in the admin sidebar. This would provide plugins with better UI integration without DOM manipulation and make the menubar extensible and maintainable.
Current Problem
Admin Menubar State
The admin sidebar (admin/themes/default/template/admin.tpl) consists of static expandable sections (<dl>) hardcoded in the theme template. Each section follows this pattern:
Add a hook in admin.php (after $U_PLUGINS assignment):
// Call the hook to retrieve submenu items
$plugins_menu_items=trigger_change('admin_menubar_plugin_links',array());$template->assign('PLUGINS_MENU_ITEMS',$plugins_menu_items);
2. Modify Template admin.tpl
Replace the static Plugins section with a dynamic one:
Should we add a second hook admin_menubar_before_plugins to add sections before Plugins?
Should we support an active flag on each item to auto-highlight?
Should we expose a helper get_plugin_menu_item() to normalize structure?
Conclusion
Adding the admin_menubar_plugin_links hook is a legitimate request to improve plugin integration in the admin interface. It's a minor and sustainable modification that solves a UI design problem without impacting performance or compatibility.
Recommended : ⭐ Accept (30 min implementation, immediate UX gain for plugins and users)
# Piwigo Feature Request: Hook for Adding Plugin Submenu to Admin Menubar
**Author** : Gotcha (Piwigo Mosaic plugin)
**Date** : 2026-03-03
**Repository** : https://github.com/Piwigo/Piwigo
**Type** : Feature Request
---
## Summary
Add a **`admin_menubar_plugin_links` hook** allowing plugins to inject entries into an expandable submenu under the "Plugins" section in the admin sidebar. This would provide plugins with better UI integration without DOM manipulation and make the menubar **extensible and maintainable**.
---
## Current Problem
### Admin Menubar State
The admin sidebar (`admin/themes/default/template/admin.tpl`) consists of static expandable sections (`<dl>`) hardcoded in the theme template. Each section follows this pattern:
```html
<dl>
<dt>
<i class="icon-xxx"></i>
<span>Title</span>
<i class="icon-down-open open-menu"></i>
</dt>
<dd>
<ul>
<li><a href="...">Link</a></li>
</ul>
</dd>
</dl>
```
**Issue** : The "Plugins" section is currently **simplified** — it has **no `<dd>`** and works as a simple link:
```html
<dl>
<dt>
<a href="{$U_PLUGINS}" class="admin-main">
<i class="icon-puzzle"></i>
<span>Plugins</span>
</a>
</dt>
</dl>
```
### Situation with Plugins
There is **no native mechanism** allowing a plugin to add entries to the admin sidebar. Available hooks are **insufficient**:
| Hook | Current Usefulness |
|------|------------------|
| `get_admin_plugin_menu_links` | Adds links on the *plugin list page*, not in the sidebar |
| `loc_begin_admin` | Runs before admin rendering, no access to menubar template |
| `loc_begin_admin_page` | Allows HTML/JS injection, but requires DOM manipulation (fragile) |
| `loc_end_admin` | Runs after rendering, too late for certain operations |
**Consequence** : Plugins like **Mosaic** cannot display their menu in the sidebar without:
1. **JavaScript DOM manipulation** (fragile, not sustainable)
2. **Admin theme modification** (complicated, not scalable)
3. **Third-party injection plugin** (increased complexity)
---
## Proposed Solution
### 1. New Hook: `admin_menubar_plugin_links`
Add a hook in `admin.php` (after `$U_PLUGINS` assignment):
```php
// Call the hook to retrieve submenu items
$plugins_menu_items = trigger_change('admin_menubar_plugin_links', array());
$template->assign('PLUGINS_MENU_ITEMS', $plugins_menu_items);
```
### 2. Modify Template `admin.tpl`
Replace the static Plugins section with a dynamic one:
```smarty
<dl id="menubar-plugins">
<dt>
{if $PLUGINS_MENU_ITEMS}
<i class="icon-puzzle"></i>
<span>{'Plugins'|@translate} </span>
<i class="icon-down-open open-menu"></i>
{else}
<a href="{$U_PLUGINS}" class="admin-main">
<i class="icon-puzzle"></i>
<span>{'Plugins'|@translate} </span>
</a>
{/if}
</dt>
{if $PLUGINS_MENU_ITEMS}
<dd>
<ul>
<li><a href="{$U_PLUGINS}"><i class="icon-list"></i>{'Manage'|@translate}</a></li>
{foreach from=$PLUGINS_MENU_ITEMS item=item}
<li><a href="{$item.URL}"><i class="{$item.ICON|default:'icon-puzzle'}"></i>{$item.NAME}</a></li>
{/foreach}
</ul>
</dd>
{/if}
</dl>
```
### 3. Plugin Usage Example (Mosaic)
A plugin can simply register its hook:
```php
add_event_handler('admin_menubar_plugin_links', 'Mosaic_menubar_link');
function Mosaic_menubar_link($items)
{
$items[] = array(
'NAME' => 'Mosaic',
'URL' => get_admin_plugin_menu_link(MOSAIC_PATH . 'admin.php'),
'ICON' => 'icon-th',
);
return $items;
}
```
---
## Benefits of This Approach
| Aspect | Details |
|--------|---------|
| **Cleanliness** | No DOM manipulation — server-side rendering, no fragile JavaScript |
| **Backward Compatibility** | Without plugins, the section remains a simple link (unchanged behavior) |
| **Extensibility** | Each plugin adds its entry independently, without collisions |
| **Maintainability** | Centralized modification in `admin.php` and `admin.tpl` |
| **Theme Support** | Compatible with all admin themes (not limited to `default`) |
| **Flexibility** | Future support for `$ACTIVE_MENU` flag to highlight the section |
---
## No Breaking Changes
- **By default** : Without plugins, `$PLUGINS_MENU_ITEMS` is empty → behavior identical to today
- **With plugins** : The hook adds entries and activates the submenu → improved user experience
- **Custom themes** : Themes that don't implement the modified template retain their current behavior
---
## Implementation Estimate
| Element | Effort |
|---------|--------|
| Add hook in `admin.php` | ~5 min |
| Modify `admin.tpl` template | ~10 min |
| Manage `$ACTIVE_MENU` (optional) | ~15 min |
| **Total** | ~30 min (very surgical) |
---
## Primary Use Cases
1. **Mosaic** — Display a link to the plugin's admin panel directly in the sidebar
2. **Layout Plugins** — Integrate their panels in the sidebar for better UX
3. **Admin Plugins** — centralAdmin, etc., can easily expose their menus
---
## Priority Suggestion
- **Priority** : Medium (UX improvement, not critical but highly desired)
- **Complexity** : Very Low (~30 minutes of dev)
- **Risk** : None (surgical modification, backward compatible)
---
## Discussion Points (Optional)
- Should we add a second hook `admin_menubar_before_plugins` to add sections **before** Plugins?
- Should we support an `active` flag on each item to auto-highlight?
- Should we expose a helper `get_plugin_menu_item()` to normalize structure?
---
## Conclusion
Adding the `admin_menubar_plugin_links` hook is a **legitimate request** to improve plugin integration in the admin interface. It's a **minor and sustainable** modification that solves a UI design problem without impacting performance or compatibility.
**Recommended** : ⭐ Accept (30 min implementation, immediate UX gain for plugins and users)
<!-- github-sync-id:4018537080 -->
Ajouter un hook admin_menubar_plugin_links permettant à un plugin d'injecter des entrées dans un sous-menu dépliable sous la section "Plugins" du menubar latéral de l'interface admin Piwigo. Cela offrirait aux plugins une meilleure intégration UI sans manipulation DOM et rendrait le menubar extensible et maintenable.
Problème actuel
État du menubar admin
Le menubar latéral admin (admin/themes/default/template/admin.tpl) est constitué de sections dépliables (<dl>) statiques, hardcodées dans le template. Chaque section suit le pattern :
Il n'existe aucun mécanisme natif permettant à un plugin d'ajouter des entrées au menubar latéral admin. Les hooks disponibles sont insuffisants :
Hook
Utilité actuelle
get_admin_plugin_menu_links
Ajoute des liens sur la page liste des plugins, pas dans le menubar
loc_begin_admin
Exécuté avant le rendu admin, pas d'accès au template menubar
loc_begin_admin_page
Permet injecter du HTML/JS, mais nécessite manipulation DOM (fragile)
loc_end_admin
Exécuté après le rendu, trop tard pour certaines opérations
Conséquence : Les plugins comme Mosaic ne peuvent pas afficher leur menu dans le menubar sans :
Manipulation DOM en JavaScript (fragile, non pérenne)
Modification du thème admin (compliqué, peu évolutif)
Plugin tiers pour l'injection (complexité accrue)
Solution proposée
1. Nouveau hook : admin_menubar_plugin_links
Ajouter un hook dans admin.php (après l'assignation de $U_PLUGINS) :
// Appel du hook pour récupérer les items de sous-menu
$plugins_menu_items=trigger_change('admin_menubar_plugin_links',array());$template->assign('PLUGINS_MENU_ITEMS',$plugins_menu_items);
2. Modification du template admin.tpl
Remplacer la section Plugins statique par une section dynamique :
Faut-il un second hook admin_menubar_before_plugins pour ajouter des sections avant Plugins ?
Faut-il supporter un flag active sur chaque item pour highlighter automatiquement ?
Faut-il exposer un helper get_plugin_menu_item() pour normaliser la structure ?
Conclusion
L'ajout du hook admin_menubar_plugin_links est une demande légitime pour améliorer l'intégration des plugins dans l'interface admin. C'est une modification mineure et pérenne qui résout un problème de design UI sans impacter les performances ou la compatibilité.
Vote recommandé : ⭐ Accepter (30 min d'implémentation, gain UX immédiat pour plugins et utilisateurs)
# Demande de fonctionnalité Piwigo : Hook pour ajouter un sous-menu aux Plugins dans le menubar admin
**Auteur** : Gotcha (Piwigo Mosaic plugin)
**Date** : 2026-03-03
**Dépôt** : https://github.com/Piwigo/Piwigo
**Type** : Feature Request
---
## Résumé
Ajouter un **hook `admin_menubar_plugin_links`** permettant à un plugin d'injecter des entrées dans un sous-menu dépliable sous la section "Plugins" du menubar latéral de l'interface admin Piwigo. Cela offrirait aux plugins une meilleure intégration UI sans manipulation DOM et rendrait le menubar **extensible et maintenable**.
---
## Problème actuel
### État du menubar admin
Le menubar latéral admin (`admin/themes/default/template/admin.tpl`) est constitué de sections dépliables (`<dl>`) statiques, hardcodées dans le template. Chaque section suit le pattern :
```html
<dl>
<dt>
<i class="icon-xxx"></i>
<span>Titre</span>
<i class="icon-down-open open-menu"></i>
</dt>
<dd>
<ul>
<li><a href="...">Lien</a></li>
</ul>
</dd>
</dl>
```
**Problème** : La section "Plugins" est actuellement **simplifiée** — elle n'a **pas de `<dd>`** et fonctionne comme un simple lien :
```html
<dl>
<dt>
<a href="{$U_PLUGINS}" class="admin-main">
<i class="icon-puzzle"></i>
<span>Plugins</span>
</a>
</dt>
</dl>
```
### Situation avec les plugins
Il n'existe **aucun mécanisme natif** permettant à un plugin d'ajouter des entrées au menubar latéral admin. Les hooks disponibles sont **insuffisants** :
| Hook | Utilité actuelle |
|------|-----------------|
| `get_admin_plugin_menu_links` | Ajoute des liens sur la *page liste des plugins*, pas dans le menubar |
| `loc_begin_admin` | Exécuté avant le rendu admin, pas d'accès au template menubar |
| `loc_begin_admin_page` | Permet injecter du HTML/JS, mais nécessite manipulation DOM (fragile) |
| `loc_end_admin` | Exécuté après le rendu, trop tard pour certaines opérations |
**Conséquence** : Les plugins comme **Mosaic** ne peuvent pas afficher leur menu dans le menubar sans :
1. **Manipulation DOM en JavaScript** (fragile, non pérenne)
2. **Modification du thème admin** (compliqué, peu évolutif)
3. **Plugin tiers pour l'injection** (complexité accrue)
---
## Solution proposée
### 1. Nouveau hook : `admin_menubar_plugin_links`
Ajouter un hook dans `admin.php` (après l'assignation de `$U_PLUGINS`) :
```php
// Appel du hook pour récupérer les items de sous-menu
$plugins_menu_items = trigger_change('admin_menubar_plugin_links', array());
$template->assign('PLUGINS_MENU_ITEMS', $plugins_menu_items);
```
### 2. Modification du template `admin.tpl`
Remplacer la section Plugins statique par une section dynamique :
```smarty
<dl id="menubar-plugins">
<dt>
{if $PLUGINS_MENU_ITEMS}
<i class="icon-puzzle"></i>
<span>{'Plugins'|@translate} </span>
<i class="icon-down-open open-menu"></i>
{else}
<a href="{$U_PLUGINS}" class="admin-main">
<i class="icon-puzzle"></i>
<span>{'Plugins'|@translate} </span>
</a>
{/if}
</dt>
{if $PLUGINS_MENU_ITEMS}
<dd>
<ul>
<li><a href="{$U_PLUGINS}"><i class="icon-list"></i>{'Manage'|@translate}</a></li>
{foreach from=$PLUGINS_MENU_ITEMS item=item}
<li><a href="{$item.URL}"><i class="{$item.ICON|default:'icon-puzzle'}"></i>{$item.NAME}</a></li>
{/foreach}
</ul>
</dd>
{/if}
</dl>
```
### 3. Usage par un plugin (exemple : Mosaic)
Un plugin peut simplement enregistrer son hook :
```php
add_event_handler('admin_menubar_plugin_links', 'Mosaic_menubar_link');
function Mosaic_menubar_link($items)
{
$items[] = array(
'NAME' => 'Mosaic',
'URL' => get_admin_plugin_menu_link(MOSAIC_PATH . 'admin.php'),
'ICON' => 'icon-th',
);
return $items;
}
```
---
## Avantages de cette approche
| Aspect | Détail |
|--------|--------|
| **Propreté** | Aucune manipulation DOM — rendu serveur, pas de JavaScript fragile |
| **Rétrocompatibilité** | Sans plugin, la section reste un simple lien (comportement inchangé) |
| **Extensibilité** | Chaque plugin ajoute sa ligne indépendamment, sans collision |
| **Maintenabilité** | Modification centralisée dans `admin.php` et `admin.tpl` |
| **Thèmes** | Compatible avec tous les thèmes admin (pas limité à `default`) |
| **Flexibilité** | Support futur du flag `$ACTIVE_MENU` pour highlighter la section |
---
## Pas de breaking change
- **Par défaut** : Sans plugin, `$PLUGINS_MENU_ITEMS` est vide → comportement identique à aujourd'hui
- **Avec plugin** : Le hook ajoute les entrées et active le sous-menu → expérience utilisateur améliorée
- **Thèmes personnalisés** : Les thèmes qui n'implémentent pas le template modifié conservent leur comportement actuel
---
## Implémentation estimée
| Élément | Effort |
|---------|--------|
| Ajout du hook dans `admin.php` | ~5 min |
| Modification du template `admin.tpl` | ~10 min |
| Gestion `$ACTIVE_MENU` (optionnel) | ~15 min |
| **Total** | ~30 min (très chirurgical) |
---
## Cas d'usage prioritaire
1. **Mosaic** — Afficher un lien vers l'admin du plugin directement dans le menubar
2. **Plugins layout** — Intégrer leurs panels dans le menubar pour meilleur UX
3. **Plugins d'administration** — centralAdmin, etc., peuvent exposer leurs menus facilement
---
## Suggestions de priorité
- **Priorité** : Moyenne (amélioration UX, pas critique mais très désirée)
- **Complexité** : Très basse (~30 minutes de dev)
- **Risque** : Nul (modification chirurgicale, rétrocompatible)
---
## Points de discussion (optionnels)
- Faut-il un second hook `admin_menubar_before_plugins` pour ajouter des sections **avant** Plugins ?
- Faut-il supporter un flag `active` sur chaque item pour highlighter automatiquement ?
- Faut-il exposer un helper `get_plugin_menu_item()` pour normaliser la structure ?
---
## Conclusion
L'ajout du hook `admin_menubar_plugin_links` est une **demande légitime** pour améliorer l'intégration des plugins dans l'interface admin. C'est une modification **mineure et pérenne** qui résout un problème de design UI sans impacter les performances ou la compatibilité.
**Vote recommandé** : ⭐ Accepter (30 min d'implémentation, gain UX immédiat pour plugins et utilisateurs)
<!-- github-comment-id:3993331652 -->
The admin_menubar_plugin_links hook allows your plugin to add entries to the Piwigo admin interface's sidebar menubar. This provides your users with direct access to your plugin's admin panel without complex navigation.
Before / After
Before : Users navigate to Admin > Plugins > List, then click on your plugin.
After : A single click in the sidebar menubar accesses your admin panel directly.
Registering the Hook
Basic Syntax
In your plugin's main.inc.php file, register the hook:
// ❌ BAD: Database query on every page load
functionmy_plugin_menubar_register($items){$count=pwg_query("SELECT COUNT(*) FROM ...");// SLOW
$items[]=array('NAME'=>"My Plugin ($count)",...);return$items;}// ✅ GOOD: Static information only
functionmy_plugin_menubar_register($items){$items[]=array('NAME'=>'My Plugin',...);return$items;}
Preference Management (Admin > Plugins > Menubar)
Piwigo administrators can manage your entries via Admin > Plugins > Menubar:
Reorder : Drag-and-drop to change order
Hide : Uncheck to hide an entry without removing it
Add separators : Group entries visually
Your plugin doesn't need to do anything — these preferences are handled automatically.
Real-World Example: Mosaic Plugin
<?php// plugins/mosaic/main.inc.php
defined('PHPWG_ROOT_PATH')ordie('Hacking attempt!');// ... plugin code ...
add_event_handler('admin_menubar_plugin_links','mosaic_menubar_register');/**
* Registers the Mosaic entry in the admin menubar
*/functionmosaic_menubar_register($items){$items[]=array('ID'=>'mosaic_plugin','NAME'=>'Mosaic','URL'=>get_admin_plugin_menu_link(MOSAIC_PATH.'admin.php'),'ICON'=>'icon-th',);return$items;}?>
Troubleshooting
My entry doesn't appear
Verify your plugin is enabled — the hook only fires for active plugins
Check syntax — the callback must return the $items array
Verify admin panel exists — admin.php must exist in your plugin folder
Check permissions — only administrators see the menubar
My icon doesn't display correctly
Ensure the icon class is correct (e.g., icon-cog, not cog)
Icons are from Font Awesome (Piwigo-compatible)
When in doubt, omit ICON to use the default
Entry order keeps changing
This is normal! Administrators can reorganize entries via the management panel. For initial ordering, use consistent IDs.
# Hook admin_menubar_plugin_links — Plugin Developer Guide
**Piwigo 14.0+**
## Overview
The `admin_menubar_plugin_links` hook allows your plugin to add entries to the Piwigo admin interface's sidebar menubar. This provides your users with direct access to your plugin's admin panel without complex navigation.
### Before / After
**Before** : Users navigate to Admin > Plugins > List, then click on your plugin.
**After** : A single click in the sidebar menubar accesses your admin panel directly.
---
## Registering the Hook
### Basic Syntax
In your plugin's `main.inc.php` file, register the hook:
```php
<?php
// plugins/my_plugin/main.inc.php
defined('PHPWG_ROOT_PATH') or die('Hacking attempt!');
add_event_handler('admin_menubar_plugin_links', 'my_plugin_menubar_register');
function my_plugin_menubar_register($items)
{
$items[] = array(
'NAME' => 'My Plugin',
'URL' => get_admin_plugin_menu_link(MY_PLUGIN_PATH . 'admin.php'),
'ICON' => 'icon-cog',
);
return $items;
}
?>
```
### Important Notes
1. **The hook is called on every admin page load** — ensure your callback is performant
2. **Always return the `$items` array** — even if you only add entries
3. **Plugin order is not guaranteed** — administrators can reorganize via Admin > Plugins > Menubar
---
## Menu Item Structure
Each element in the `$items` array must follow this structure:
### Required Parameters
| Key | Type | Description |
|-----|------|-------------|
| `NAME` | string | Display name in the menubar. Keep it short (< 30 characters for readability) |
| `URL` | string | URL to your plugin's admin panel |
### Optional Parameters
| Key | Type | Description |
|-----|------|-------------|
| `ICON` | string | Font Awesome icon class (e.g., `icon-cog`, `icon-th`, `icon-sliders`). Default: `icon-puzzle` |
| `ID` | string | Unique identifier for order and visibility management. Auto-generated if omitted, but recommended for stability |
### Complete Example
```php
function my_plugin_menubar_register($items)
{
$items[] = array(
'NAME' => 'Mosaic',
'URL' => get_admin_plugin_menu_link(MOSAIC_PATH . 'admin.php'),
'ICON' => 'icon-th',
'ID' => 'mosaic_plugin',
);
return $items;
}
```
---
## Best Practices
### 1. Idempotence: Check if Already Registered
If your plugin is called multiple times (rare but possible), verify you don't add duplicate entries:
```php
function my_plugin_menubar_register($items)
{
// Check if our entry already exists
foreach ($items as $item)
{
if (isset($item['ID']) && $item['ID'] === 'my_plugin')
{
return $items; // Already registered
}
}
$items[] = array(
'ID' => 'my_plugin',
'NAME' => 'My Plugin',
'URL' => get_admin_plugin_menu_link(MY_PLUGIN_PATH . 'admin.php'),
'ICON' => 'icon-cog',
);
return $items;
}
```
### 2. Use `get_admin_plugin_menu_link()`
Always use this function to generate your admin panel URL:
```php
'URL' => get_admin_plugin_menu_link(MY_PLUGIN_PATH . 'admin.php'),
```
This ensures compatibility with complex file paths and URL rewrites.
### 3. Follow ID Naming Conventions
Use a prefixed format to avoid collisions:
```php
'ID' => 'my_plugin', // Good
'ID' => 'mosaic_images_layout', // Good (descriptive)
'ID' => 'foo_bar_baz_123', // Valid but verbose
```
IDs must be alphanumeric + underscore: `[a-zA-Z0-9_]`
### 4. Choose an Appropriate Icon
Some popular icon suggestions:
```php
'ICON' => 'icon-cog', // Settings / configuration
'ICON' => 'icon-th', // Gallery / mosaic
'ICON' => 'icon-sliders', // Adjustments / filters
'ICON' => 'icon-palette', // Colors / theme
'ICON' => 'icon-file-image', // Images
'ICON' => 'icon-users', // Users
'ICON' => 'icon-lock', // Security / permissions
'ICON' => 'icon-puzzle', // Default (if no icon fits)
```
Check the full Font Awesome icon list for Piwigo compatibility.
### Accessing the Complete Fontello Icon List
Piwigo includes a **customized Fontello icon font**. To explore all available icons:
#### Option 1: Consult the demo.html File (Local)
1. Navigate to: `admin/themes/default/fontello/demo.html`
2. Open the file in your web browser
3. You'll see the complete icon gallery with their names (e.g., `icon-cog`, `icon-th`, etc.)
#### Option 2: Inspect the CSS File
Icon definitions are located in:
```
admin/themes/default/fontello/css/fontello.css
```
You'll find lines like:
```css
.icon-cog:before { content: '\f013'; } /* '' */
.icon-th:before { content: '\f009'; } /* '' */
.icon-lock:before { content: '\f023'; } /* '' */
```
Each class corresponds to a Unicode character rendered by the Fontello font.
#### Option 3: Use Browser DevTools (F12)
1. Open any Piwigo admin page
2. Press **F12** to open devtools
3. Use the inspector to target an element with an icon (e.g., `<i class="icon-cog">`)
4. In the **Styles** tab, you'll see the icon class and rendered character
5. Consult the CSS source file to see all available icons
#### Example: Adding a Custom Icon
If you want a specific icon (e.g., users, lock, images, etc.):
1. **Consult `demo.html`** to list all available icons
2. **Copy the exact name** (e.g., `icon-users`, `icon-lock`, `icon-file-image`)
3. **Use it in your hook**:
```php
$items[] = array(
'NAME' => 'User Management',
'URL' => get_admin_plugin_menu_link(MY_PLUGIN_PATH . 'admin.php'),
'ICON' => 'icon-users', // Users icon
'ID' => 'my_plugin_users',
);
```
### 5. Avoid Expensive Operations
The hook fires on every admin page load. Avoid:
```php
// ❌ BAD: Database query on every page load
function my_plugin_menubar_register($items)
{
$count = pwg_query("SELECT COUNT(*) FROM ..."); // SLOW
$items[] = array('NAME' => "My Plugin ($count)", ...);
return $items;
}
// ✅ GOOD: Static information only
function my_plugin_menubar_register($items)
{
$items[] = array('NAME' => 'My Plugin', ...);
return $items;
}
```
---
## Preference Management (Admin > Plugins > Menubar)
Piwigo administrators can manage your entries via **Admin > Plugins > Menubar**:
- **Reorder** : Drag-and-drop to change order
- **Hide** : Uncheck to hide an entry without removing it
- **Add separators** : Group entries visually
Your plugin doesn't need to do anything — these preferences are handled automatically.
---
## Real-World Example: Mosaic Plugin
```php
<?php
// plugins/mosaic/main.inc.php
defined('PHPWG_ROOT_PATH') or die('Hacking attempt!');
// ... plugin code ...
add_event_handler('admin_menubar_plugin_links', 'mosaic_menubar_register');
/**
* Registers the Mosaic entry in the admin menubar
*/
function mosaic_menubar_register($items)
{
$items[] = array(
'ID' => 'mosaic_plugin',
'NAME' => 'Mosaic',
'URL' => get_admin_plugin_menu_link(MOSAIC_PATH . 'admin.php'),
'ICON' => 'icon-th',
);
return $items;
}
?>
```
---
## Troubleshooting
### My entry doesn't appear
1. **Verify your plugin is enabled** — the hook only fires for active plugins
2. **Check syntax** — the callback must return the `$items` array
3. **Verify admin panel exists** — `admin.php` must exist in your plugin folder
4. **Check permissions** — only administrators see the menubar
### My icon doesn't display correctly
- Ensure the icon class is correct (e.g., `icon-cog`, not `cog`)
- Icons are from Font Awesome (Piwigo-compatible)
- When in doubt, omit `ICON` to use the default
### Entry order keeps changing
This is normal! Administrators can reorganize entries via the management panel. For initial ordering, use consistent IDs.
---
## Typical Use Cases
### Gallery Layout Plugin
```php
add_event_handler('admin_menubar_plugin_links', 'my_gallery_menubar');
function my_gallery_menubar($items)
{
$items[] = array(
'NAME' => 'My Gallery Layout',
'URL' => get_admin_plugin_menu_link(MY_GALLERY_PATH . 'admin.php'),
'ICON' => 'icon-th-large',
'ID' => 'my_gallery_layout',
);
return $items;
}
```
### Security Plugin
```php
add_event_handler('admin_menubar_plugin_links', 'security_plugin_menubar');
function security_plugin_menubar($items)
{
$items[] = array(
'NAME' => 'Security',
'URL' => get_admin_plugin_menu_link(SECURITY_PLUGIN_PATH . 'admin.php'),
'ICON' => 'icon-lock',
'ID' => 'security_admin',
);
return $items;
}
```
### Plugin with Multiple Sections (Multiple Entries)
```php
add_event_handler('admin_menubar_plugin_links', 'my_plugin_menubar');
function my_plugin_menubar($items)
{
$base_url = get_admin_plugin_menu_link(MY_PLUGIN_PATH);
// Check that entries don't already exist
$ids = array();
foreach ($items as $item) {
if (isset($item['ID'])) {
$ids[] = $item['ID'];
}
}
// Add main entries
if (!in_array('my_plugin_settings', $ids)) {
$items[] = array(
'ID' => 'my_plugin_settings',
'NAME' => 'Settings',
'URL' => $base_url . 'admin_settings.php',
'ICON' => 'icon-cog',
);
}
if (!in_array('my_plugin_logs', $ids)) {
$items[] = array(
'ID' => 'my_plugin_logs',
'NAME' => 'Logs',
'URL' => $base_url . 'admin_logs.php',
'ICON' => 'icon-list',
);
}
return $items;
}
```
---
## Resources
- **Piwigo Hooks** : https://piwigo.org/en/doc/doku.php?id=dev:plugins:events
- **Font Awesome Icons** : https://fontawesome.io/icons/
- **Piwigo Plugin Development** : https://piwigo.org/en/doc/doku.php?id=dev:plugins
---
## Change Log
| Version | Date | Change |
|---------|------|--------|
| 1.0 | 2026-03-04 | Initial documentation |
---
## Support
If you have questions about this hook, consult:
1. Source code: `admin/include/add_core_tabs.inc.php` (tab registration)
2. Processing file: `admin/plugins_menubar.php` (preference management)
3. Piwigo forums/issues
---
**Author** : Gotcha
**License** : Same as Piwigo (GPLv2)
<!-- github-comment-id:4016313006 -->
Hook admin_menubar_plugin_links — Documentation pour les développeurs de plugins
Piwigo 14.0+
Vue d'ensemble
Le hook admin_menubar_plugin_links permet à votre plugin d'ajouter des entrées dans le menubar latéral de l'interface d'administration Piwigo. Cela offre à vos utilisateurs un accès direct au panneau d'administration de votre plugin sans navigation complexe.
Avant / Après
Avant : Les utilisateurs doivent aller sur Admin > Plugins > Liste, puis cliquer sur votre plugin.
Après : Un simple clic dans le menubar latéral accède directement à votre panneau.
Enregistrement du hook
Syntaxe basique
Dans le fichier main.inc.php de votre plugin, enregistrez le hook :
Si votre plugin est appelé plusieurs fois (cas rare mais possible), vérifiez que vous n'ajoutez pas l'entrée en double :
functionmon_plugin_menubar_register($items){// Vérifier que notre entrée n'existe pas déjà
foreach($itemsas$item){if(isset($item['ID'])&&$item['ID']==='mon_plugin'){return$items;// Déjà enregistré
}}$items[]=array('ID'=>'mon_plugin','NAME'=>'Mon Plugin','URL'=>get_admin_plugin_menu_link(MON_PLUGIN_PATH.'admin.php'),'ICON'=>'icon-cog',);return$items;}
2. Utiliser get_admin_plugin_menu_link()
Toujours utiliser cette fonction pour générer l'URL de votre panneau admin :
Plugin avec plusieurs sections (ajouter plusieurs entrées)
add_event_handler('admin_menubar_plugin_links','my_plugin_menubar');functionmy_plugin_menubar($items){$base_url=get_admin_plugin_menu_link(MY_PLUGIN_PATH);// Vérifier que les entrées n'existent pas déjà
$ids=array();foreach($itemsas$item){if(isset($item['ID'])){$ids[]=$item['ID'];}}// Ajouter les entrées principales
if(!in_array('my_plugin_settings',$ids)){$items[]=array('ID'=>'my_plugin_settings','NAME'=>'Settings','URL'=>$base_url.'admin_settings.php','ICON'=>'icon-cog',);}if(!in_array('my_plugin_logs',$ids)){$items[]=array('ID'=>'my_plugin_logs','NAME'=>'Logs','URL'=>$base_url.'admin_logs.php','ICON'=>'icon-list',);}return$items;}
Si vous avez des questions sur ce hook, consultez :
Le code source : admin/include/add_core_tabs.inc.php (enregistrement du tab)
Le fichier de traitement : admin/plugins_menubar.php (gestion des préférences)
Les forums/issues Piwigo
Auteur : Gotcha Licence : Même licence que Piwigo (GPLv2)
# Hook admin_menubar_plugin_links — Documentation pour les développeurs de plugins
**Piwigo 14.0+**
## Vue d'ensemble
Le hook `admin_menubar_plugin_links` permet à votre plugin d'ajouter des entrées dans le menubar latéral de l'interface d'administration Piwigo. Cela offre à vos utilisateurs un accès direct au panneau d'administration de votre plugin sans navigation complexe.
### Avant / Après
**Avant** : Les utilisateurs doivent aller sur Admin > Plugins > Liste, puis cliquer sur votre plugin.
**Après** : Un simple clic dans le menubar latéral accède directement à votre panneau.
---
## Enregistrement du hook
### Syntaxe basique
Dans le fichier `main.inc.php` de votre plugin, enregistrez le hook :
```php
<?php
// plugins/mon_plugin/main.inc.php
defined('PHPWG_ROOT_PATH') or die('Hacking attempt!');
add_event_handler('admin_menubar_plugin_links', 'mon_plugin_menubar_register');
function mon_plugin_menubar_register($items)
{
$items[] = array(
'NAME' => 'Mon Plugin',
'URL' => get_admin_plugin_menu_link(MON_PLUGIN_PATH . 'admin.php'),
'ICON' => 'icon-cog',
);
return $items;
}
?>
```
### Points importants
1. **Le hook est appelé à chaque chargement de la page admin** — assurez-vous que votre callback est performant
2. **Retournez toujours le tableau `$items`** — même si vous n'ajoutez qu'une seule entrée
3. **L'ordre d'enregistrement des plugins ne garantit pas l'ordre final** — l'administrateur peut réorganiser via Admin > Plugins > Menubar
---
## Structure des éléments de menu
Chaque élément du tableau `$items` doit respecter cette structure :
### Paramètres obligatoires
| Clé | Type | Description |
|-----|------|-------------|
| `NAME` | string | Nom affiché dans le menubar. Doit être court (< 30 caractères pour une bonne lisibilité) |
| `URL` | string | URL du panneau d'administration du plugin |
### Paramètres optionnels
| Clé | Type | Description |
|-----|------|-------------|
| `ICON` | string | Classe d'icône Font Awesome (ex: `icon-cog`, `icon-th`, `icon-sliders`). Défaut : `icon-puzzle` |
| `ID` | string | Identifiant unique pour gérer l'ordre et la visibilité. Auto-généré si absent, mais recommandé pour la stabilité |
### Exemple complet
```php
function mon_plugin_menubar_register($items)
{
$items[] = array(
'NAME' => 'Mosaic',
'URL' => get_admin_plugin_menu_link(MOSAIC_PATH . 'admin.php'),
'ICON' => 'icon-th',
'ID' => 'mosaic_plugin',
);
return $items;
}
```
---
## Bonnes pratiques
### 1. Idempotence : Vérifier si déjà enregistré
Si votre plugin est appelé plusieurs fois (cas rare mais possible), vérifiez que vous n'ajoutez pas l'entrée en double :
```php
function mon_plugin_menubar_register($items)
{
// Vérifier que notre entrée n'existe pas déjà
foreach ($items as $item)
{
if (isset($item['ID']) && $item['ID'] === 'mon_plugin')
{
return $items; // Déjà enregistré
}
}
$items[] = array(
'ID' => 'mon_plugin',
'NAME' => 'Mon Plugin',
'URL' => get_admin_plugin_menu_link(MON_PLUGIN_PATH . 'admin.php'),
'ICON' => 'icon-cog',
);
return $items;
}
```
### 2. Utiliser `get_admin_plugin_menu_link()`
Toujours utiliser cette fonction pour générer l'URL de votre panneau admin :
```php
'URL' => get_admin_plugin_menu_link(MON_PLUGIN_PATH . 'admin.php'),
```
Cela garantit la compatibilité avec les chemins de fichiers compliqués et les URL réécrites.
### 3. Respecter les conventions de nommage pour les IDs
Utilisez un format préfixé pour éviter les collisions :
```php
'ID' => 'mon_plugin', // Bon
'ID' => 'mosaic_images_layout', // Bon (descriptif)
'ID' => 'foo_bar_baz_123', // Valide mais un peu long
```
Les IDs doivent être alphanumériques + underscore : `[a-zA-Z0-9_]`
### 4. Choisir une icône appropriée
Quelques suggestions d'icônes populaires :
```php
'ICON' => 'icon-cog', // Paramètres / configuration
'ICON' => 'icon-th', // Galerie / mosaïque
'ICON' => 'icon-sliders', // Réglages / filtres
'ICON' => 'icon-palette', // Couleurs / thème
'ICON' => 'icon-file-image', // Images
'ICON' => 'icon-users', // Utilisateurs
'ICON' => 'icon-lock', // Sécurité / permissions
'ICON' => 'icon-puzzle', // Défaut (si aucune icône appropriée)
```
Consultez la liste complète des icônes Font Awesome compatibles.
### Accéder à la liste complète des icônes Fontello
Piwigo embarque une **police d'icônes Fontello customisée**. Pour explorer toutes les icônes disponibles :
#### Option 1 : Consulter le fichier demo.html (local)
1. Navigez vers : `admin/themes/default/fontello/demo.html`
2. Ouvrez le fichier dans votre navigateur web
3. Vous verrez la galerie complète des icônes avec leurs noms (ex: `icon-cog`, `icon-th`, etc.)
#### Option 2 : Inspecter le fichier CSS
Les définitions des icônes se trouvent dans :
```
admin/themes/default/fontello/css/fontello.css
```
Vous y trouverez des lignes comme :
```css
.icon-cog:before { content: '\f013'; } /* '' */
.icon-th:before { content: '\f009'; } /* '' */
.icon-lock:before { content: '\f023'; } /* '' */
```
Chaque classe correspond à un caractère Unicode spécifique rendu par la police Fontello.
#### Option 3 : Utiliser les devtools du navigateur (F12)
1. Ouvrez une page d'administration Piwigo
2. Appuyez sur **F12** pour ouvrir les devtools
3. Utilisez l'inspecteur pour cibler un élément avec une icône (ex: `<i class="icon-cog">`)
4. Dans l'onglet **Styles**, vous verrez la classe d'icône et le caractère rendu
5. Consultez le fichier CSS source pour voir toutes les icônes disponibles
#### Exemple : Ajouter une icône personnalisée
Si vous voulez une icône spécifique (ex: icônes utilisateur, cadenas, images, etc.) :
1. **Consultez `demo.html`** pour lister toutes les icônes disponibles
2. **Copiez le nom exact** (ex: `icon-users`, `icon-lock`, `icon-file-image`)
3. **Utilisez-le dans votre hook** :
```php
$items[] = array(
'NAME' => 'User Management',
'URL' => get_admin_plugin_menu_link(MY_PLUGIN_PATH . 'admin.php'),
'ICON' => 'icon-users', // Icône utilisateurs
'ID' => 'my_plugin_users',
);
```
### 5. Éviter les opérations coûteuses
Le hook est déclenché à chaque chargement de page admin. Évitez :
```php
// ❌ MAUVAIS : requête SQL à chaque chargement
function mon_plugin_menubar_register($items)
{
$count = pwg_query("SELECT COUNT(*) FROM ..."); // LENT
$items[] = array('NAME' => "Mon Plugin ($count)", ...);
return $items;
}
// ✅ BON : informations statiques uniquement
function mon_plugin_menubar_register($items)
{
$items[] = array('NAME' => 'Mon Plugin', ...);
return $items;
}
```
---
## Gestion des préférences (Admin > Plugins > Menubar)
Les administrateurs Piwigo peuvent gérer vos entrées via **Admin > Plugins > Menubar** :
- **Réordonner** : Glisser-déposer pour changer l'ordre
- **Masquer** : Décocher pour masquer une entrée sans la supprimer
- **Ajouter des séparateurs** : Grouper les entrées visuellement
Votre plugin n'a rien à faire — ces préférences sont gérées automatiquement.
---
## Exemple réel : Plugin Mosaic
```php
<?php
// plugins/mosaic/main.inc.php
defined('PHPWG_ROOT_PATH') or die('Hacking attempt!');
// ... code du plugin ...
add_event_handler('admin_menubar_plugin_links', 'mosaic_menubar_register');
/**
* Enregistre l'entrée Mosaic dans le menubar admin
*/
function mosaic_menubar_register($items)
{
$items[] = array(
'ID' => 'mosaic_plugin',
'NAME' => 'Mosaic',
'URL' => get_admin_plugin_menu_link(MOSAIC_PATH . 'admin.php'),
'ICON' => 'icon-th',
);
return $items;
}
?>
```
---
## Dépannage
### Mon entrée n'apparaît pas
1. **Vérifiez que votre plugin est activé** — le hook ne se déclenche que pour les plugins actifs
2. **Vérifiez la syntaxe** — le callback doit retourner le tableau `$items`
3. **Vérifiez que votre panneau d'admin existe** — `admin.php` doit exister dans le dossier du plugin
4. **Vérifiez les permissions** — seul un administrateur peut voir le menubar
### Mon icône n'apparaît pas correctement
- Assurez-vous que la classe d'icône est correcte (ex: `icon-cog`, pas `cog`)
- Les icônes proviennent de Font Awesome (compatible Piwigo)
- En cas de doute, omettez `ICON` pour utiliser le défaut
### L'ordre de mes entrées change
C'est normal ! L'administrateur peut réorganiser les entrées via le panneau de gestion. Pour un ordre initial, utilisez des IDs cohérents.
---
## Cas d'usage typiques
### Plugin de galerie (layout)
```php
add_event_handler('admin_menubar_plugin_links', 'my_gallery_menubar');
function my_gallery_menubar($items)
{
$items[] = array(
'NAME' => 'My Gallery Layout',
'URL' => get_admin_plugin_menu_link(MY_GALLERY_PATH . 'admin.php'),
'ICON' => 'icon-th-large',
'ID' => 'my_gallery_layout',
);
return $items;
}
```
### Plugin de sécurité
```php
add_event_handler('admin_menubar_plugin_links', 'security_plugin_menubar');
function security_plugin_menubar($items)
{
$items[] = array(
'NAME' => 'Security',
'URL' => get_admin_plugin_menu_link(SECURITY_PLUGIN_PATH . 'admin.php'),
'ICON' => 'icon-lock',
'ID' => 'security_admin',
);
return $items;
}
```
### Plugin avec plusieurs sections (ajouter plusieurs entrées)
```php
add_event_handler('admin_menubar_plugin_links', 'my_plugin_menubar');
function my_plugin_menubar($items)
{
$base_url = get_admin_plugin_menu_link(MY_PLUGIN_PATH);
// Vérifier que les entrées n'existent pas déjà
$ids = array();
foreach ($items as $item) {
if (isset($item['ID'])) {
$ids[] = $item['ID'];
}
}
// Ajouter les entrées principales
if (!in_array('my_plugin_settings', $ids)) {
$items[] = array(
'ID' => 'my_plugin_settings',
'NAME' => 'Settings',
'URL' => $base_url . 'admin_settings.php',
'ICON' => 'icon-cog',
);
}
if (!in_array('my_plugin_logs', $ids)) {
$items[] = array(
'ID' => 'my_plugin_logs',
'NAME' => 'Logs',
'URL' => $base_url . 'admin_logs.php',
'ICON' => 'icon-list',
);
}
return $items;
}
```
---
## Ressources
- **Hooks Piwigo** : https://piwigo.org/en/doc/doku.php?id=dev:plugins:events
- **Font Awesome Icons** : https://fontawesome.io/icons/
- **Piwigo Plugin Development** : https://piwigo.org/en/doc/doku.php?id=dev:plugins
---
## Historique des modifications
| Version | Date | Changement |
|---------|------|-----------|
| 1.0 | 2026-03-04 | Documentation initiale |
---
## Support
Si vous avez des questions sur ce hook, consultez :
1. Le code source : `admin/include/add_core_tabs.inc.php` (enregistrement du tab)
2. Le fichier de traitement : `admin/plugins_menubar.php` (gestion des préférences)
3. Les forums/issues Piwigo
---
**Auteur** : Gotcha
**Licence** : Même licence que Piwigo (GPLv2)
<!-- github-comment-id:4016313226 -->
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Piwigo Feature Request: Hook for Adding Plugin Submenu to Admin Menubar
Author : Gotcha (Piwigo Mosaic plugin)
Date : 2026-03-03
Repository : https://github.com/Piwigo/Piwigo
Type : Feature Request
Summary
Add a
admin_menubar_plugin_linkshook allowing plugins to inject entries into an expandable submenu under the "Plugins" section in the admin sidebar. This would provide plugins with better UI integration without DOM manipulation and make the menubar extensible and maintainable.Current Problem
Admin Menubar State
The admin sidebar (
admin/themes/default/template/admin.tpl) consists of static expandable sections (<dl>) hardcoded in the theme template. Each section follows this pattern:Issue : The "Plugins" section is currently simplified — it has no
<dd>and works as a simple link:Situation with Plugins
There is no native mechanism allowing a plugin to add entries to the admin sidebar. Available hooks are insufficient:
get_admin_plugin_menu_linksloc_begin_adminloc_begin_admin_pageloc_end_adminConsequence : Plugins like Mosaic cannot display their menu in the sidebar without:
Proposed Solution
1. New Hook:
admin_menubar_plugin_linksAdd a hook in
admin.php(after$U_PLUGINSassignment):2. Modify Template
admin.tplReplace the static Plugins section with a dynamic one:
3. Plugin Usage Example (Mosaic)
A plugin can simply register its hook:
Benefits of This Approach
admin.phpandadmin.tpldefault)$ACTIVE_MENUflag to highlight the sectionNo Breaking Changes
$PLUGINS_MENU_ITEMSis empty → behavior identical to todayImplementation Estimate
admin.phpadmin.tpltemplate$ACTIVE_MENU(optional)Primary Use Cases
Priority Suggestion
Discussion Points (Optional)
admin_menubar_before_pluginsto add sections before Plugins?activeflag on each item to auto-highlight?get_plugin_menu_item()to normalize structure?Conclusion
Adding the
admin_menubar_plugin_linkshook is a legitimate request to improve plugin integration in the admin interface. It's a minor and sustainable modification that solves a UI design problem without impacting performance or compatibility.Recommended : ⭐ Accept (30 min implementation, immediate UX gain for plugins and users)
Demande de fonctionnalité Piwigo : Hook pour ajouter un sous-menu aux Plugins dans le menubar admin
Auteur : Gotcha (Piwigo Mosaic plugin)
Date : 2026-03-03
Dépôt : https://github.com/Piwigo/Piwigo
Type : Feature Request
Résumé
Ajouter un hook
admin_menubar_plugin_linkspermettant à un plugin d'injecter des entrées dans un sous-menu dépliable sous la section "Plugins" du menubar latéral de l'interface admin Piwigo. Cela offrirait aux plugins une meilleure intégration UI sans manipulation DOM et rendrait le menubar extensible et maintenable.Problème actuel
État du menubar admin
Le menubar latéral admin (
admin/themes/default/template/admin.tpl) est constitué de sections dépliables (<dl>) statiques, hardcodées dans le template. Chaque section suit le pattern :Problème : La section "Plugins" est actuellement simplifiée — elle n'a pas de
<dd>et fonctionne comme un simple lien :Situation avec les plugins
Il n'existe aucun mécanisme natif permettant à un plugin d'ajouter des entrées au menubar latéral admin. Les hooks disponibles sont insuffisants :
get_admin_plugin_menu_linksloc_begin_adminloc_begin_admin_pageloc_end_adminConséquence : Les plugins comme Mosaic ne peuvent pas afficher leur menu dans le menubar sans :
Solution proposée
1. Nouveau hook :
admin_menubar_plugin_linksAjouter un hook dans
admin.php(après l'assignation de$U_PLUGINS) :2. Modification du template
admin.tplRemplacer la section Plugins statique par une section dynamique :
3. Usage par un plugin (exemple : Mosaic)
Un plugin peut simplement enregistrer son hook :
Avantages de cette approche
admin.phpetadmin.tpldefault)$ACTIVE_MENUpour highlighter la sectionPas de breaking change
$PLUGINS_MENU_ITEMSest vide → comportement identique à aujourd'huiImplémentation estimée
admin.phpadmin.tpl$ACTIVE_MENU(optionnel)Cas d'usage prioritaire
Suggestions de priorité
Points de discussion (optionnels)
admin_menubar_before_pluginspour ajouter des sections avant Plugins ?activesur chaque item pour highlighter automatiquement ?get_plugin_menu_item()pour normaliser la structure ?Conclusion
L'ajout du hook
admin_menubar_plugin_linksest une demande légitime pour améliorer l'intégration des plugins dans l'interface admin. C'est une modification mineure et pérenne qui résout un problème de design UI sans impacter les performances ou la compatibilité.Vote recommandé : ⭐ Accepter (30 min d'implémentation, gain UX immédiat pour plugins et utilisateurs)
Hook admin_menubar_plugin_links — Plugin Developer Guide
Piwigo 14.0+
Overview
The
admin_menubar_plugin_linkshook allows your plugin to add entries to the Piwigo admin interface's sidebar menubar. This provides your users with direct access to your plugin's admin panel without complex navigation.Before / After
Before : Users navigate to Admin > Plugins > List, then click on your plugin.
After : A single click in the sidebar menubar accesses your admin panel directly.
Registering the Hook
Basic Syntax
In your plugin's
main.inc.phpfile, register the hook:Important Notes
$itemsarray — even if you only add entriesMenu Item Structure
Each element in the
$itemsarray must follow this structure:Required Parameters
NAMEURLOptional Parameters
ICONicon-cog,icon-th,icon-sliders). Default:icon-puzzleIDComplete Example
Best Practices
1. Idempotence: Check if Already Registered
If your plugin is called multiple times (rare but possible), verify you don't add duplicate entries:
2. Use
get_admin_plugin_menu_link()Always use this function to generate your admin panel URL:
This ensures compatibility with complex file paths and URL rewrites.
3. Follow ID Naming Conventions
Use a prefixed format to avoid collisions:
IDs must be alphanumeric + underscore:
[a-zA-Z0-9_]4. Choose an Appropriate Icon
Some popular icon suggestions:
Check the full Font Awesome icon list for Piwigo compatibility.
Accessing the Complete Fontello Icon List
Piwigo includes a customized Fontello icon font. To explore all available icons:
Option 1: Consult the demo.html File (Local)
admin/themes/default/fontello/demo.htmlicon-cog,icon-th, etc.)Option 2: Inspect the CSS File
Icon definitions are located in:
You'll find lines like:
Each class corresponds to a Unicode character rendered by the Fontello font.
Option 3: Use Browser DevTools (F12)
<i class="icon-cog">)Example: Adding a Custom Icon
If you want a specific icon (e.g., users, lock, images, etc.):
demo.htmlto list all available iconsicon-users,icon-lock,icon-file-image)5. Avoid Expensive Operations
The hook fires on every admin page load. Avoid:
Preference Management (Admin > Plugins > Menubar)
Piwigo administrators can manage your entries via Admin > Plugins > Menubar:
Your plugin doesn't need to do anything — these preferences are handled automatically.
Real-World Example: Mosaic Plugin
Troubleshooting
My entry doesn't appear
$itemsarrayadmin.phpmust exist in your plugin folderMy icon doesn't display correctly
icon-cog, notcog)ICONto use the defaultEntry order keeps changing
This is normal! Administrators can reorganize entries via the management panel. For initial ordering, use consistent IDs.
Typical Use Cases
Gallery Layout Plugin
Security Plugin
Plugin with Multiple Sections (Multiple Entries)
Resources
Change Log
Support
If you have questions about this hook, consult:
admin/include/add_core_tabs.inc.php(tab registration)admin/plugins_menubar.php(preference management)Author : Gotcha
License : Same as Piwigo (GPLv2)
Hook admin_menubar_plugin_links — Documentation pour les développeurs de plugins
Piwigo 14.0+
Vue d'ensemble
Le hook
admin_menubar_plugin_linkspermet à votre plugin d'ajouter des entrées dans le menubar latéral de l'interface d'administration Piwigo. Cela offre à vos utilisateurs un accès direct au panneau d'administration de votre plugin sans navigation complexe.Avant / Après
Avant : Les utilisateurs doivent aller sur Admin > Plugins > Liste, puis cliquer sur votre plugin.
Après : Un simple clic dans le menubar latéral accède directement à votre panneau.
Enregistrement du hook
Syntaxe basique
Dans le fichier
main.inc.phpde votre plugin, enregistrez le hook :Points importants
$items— même si vous n'ajoutez qu'une seule entréeStructure des éléments de menu
Chaque élément du tableau
$itemsdoit respecter cette structure :Paramètres obligatoires
NAMEURLParamètres optionnels
ICONicon-cog,icon-th,icon-sliders). Défaut :icon-puzzleIDExemple complet
Bonnes pratiques
1. Idempotence : Vérifier si déjà enregistré
Si votre plugin est appelé plusieurs fois (cas rare mais possible), vérifiez que vous n'ajoutez pas l'entrée en double :
2. Utiliser
get_admin_plugin_menu_link()Toujours utiliser cette fonction pour générer l'URL de votre panneau admin :
Cela garantit la compatibilité avec les chemins de fichiers compliqués et les URL réécrites.
3. Respecter les conventions de nommage pour les IDs
Utilisez un format préfixé pour éviter les collisions :
Les IDs doivent être alphanumériques + underscore :
[a-zA-Z0-9_]4. Choisir une icône appropriée
Quelques suggestions d'icônes populaires :
Consultez la liste complète des icônes Font Awesome compatibles.
Accéder à la liste complète des icônes Fontello
Piwigo embarque une police d'icônes Fontello customisée. Pour explorer toutes les icônes disponibles :
Option 1 : Consulter le fichier demo.html (local)
admin/themes/default/fontello/demo.htmlicon-cog,icon-th, etc.)Option 2 : Inspecter le fichier CSS
Les définitions des icônes se trouvent dans :
Vous y trouverez des lignes comme :
Chaque classe correspond à un caractère Unicode spécifique rendu par la police Fontello.
Option 3 : Utiliser les devtools du navigateur (F12)
<i class="icon-cog">)Exemple : Ajouter une icône personnalisée
Si vous voulez une icône spécifique (ex: icônes utilisateur, cadenas, images, etc.) :
demo.htmlpour lister toutes les icônes disponiblesicon-users,icon-lock,icon-file-image)5. Éviter les opérations coûteuses
Le hook est déclenché à chaque chargement de page admin. Évitez :
Gestion des préférences (Admin > Plugins > Menubar)
Les administrateurs Piwigo peuvent gérer vos entrées via Admin > Plugins > Menubar :
Votre plugin n'a rien à faire — ces préférences sont gérées automatiquement.
Exemple réel : Plugin Mosaic
Dépannage
Mon entrée n'apparaît pas
$itemsadmin.phpdoit exister dans le dossier du pluginMon icône n'apparaît pas correctement
icon-cog, pascog)ICONpour utiliser le défautL'ordre de mes entrées change
C'est normal ! L'administrateur peut réorganiser les entrées via le panneau de gestion. Pour un ordre initial, utilisez des IDs cohérents.
Cas d'usage typiques
Plugin de galerie (layout)
Plugin de sécurité
Plugin avec plusieurs sections (ajouter plusieurs entrées)
Ressources
Historique des modifications
Support
Si vous avez des questions sur ce hook, consultez :
admin/include/add_core_tabs.inc.php(enregistrement du tab)admin/plugins_menubar.php(gestion des préférences)Auteur : Gotcha
Licence : Même licence que Piwigo (GPLv2)
No need, see https://fr.piwigo.org/forum/viewtopic.php?pid=244412#p244412