easy_svg_panel_menu_tabs
Filtert, welche Tabs des Icons-Panels einen eigenen Eintrag im Menü Icons bekommen und welche Berechtigung ein Benutzer für jeden dieser Tabs braucht.
Filter · Easy SVG · Status: Stabil
easy_svg_panel_menu_tabs entscheidet zwei Dinge für das Icons-Panel: welche Tabs als eigener Eintrag unter dem Menü Icons in wp-admin erscheinen, und welche Berechtigung ein Benutzer für jeden davon braucht. Trag deinen Tab hier ein, dann bekommt er einen Menülink, der das Panel direkt auf diesem Tab öffnet. Gib ihm eine niedrigere Berechtigung, dann können zum Beispiel Redakteure das Panel für deinen Tab öffnen, ohne den Rest zu sehen.
Verwendung
apply_filters( 'easy_svg_panel_menu_tabs', array $tabs );
add_filter( 'easy_svg_panel_menu_tabs', 'myaddon_menu_tabs' );
Wann du es brauchst
- Dein Add-on registriert mit
window.EasySvgPanel.registerTab()einen Panel-Tab, und der soll einen eigenen Link im Menü Icons haben. - Ein Tab soll für Benutzer ohne
manage_optionserreichbar sein, zum Beispiel für alle, die Dateien hochladen dürfen. - Du willst einen freien Tab in der Oberfläche strenger machen, etwa Einstellungen nur Benutzern mit
manage_network_optionszeigen.
Wann nicht:
- Um einen Tab ins Panel selbst zu bringen. Ein Menüeintrag allein zeichnet nichts: Der Tab muss in JavaScript mit derselben ID registriert sein.
- Um Zugriff auf die Daten von Easy SVG zu geben. Die freien REST-Routen verlangen immer
manage_options, egal was du hier einträgst. - Um einen freien Tab für alle auszublenden. Entfernst du
settingsoderlibraryaus dem Array, verschwindet nur der Menüeintrag, das Panel zeichnet den Tab für Administratoren trotzdem (siehe Stolperfallen).
Parameter
Tab-ID als Schlüssel, als Wert entweder ein schlichtes Label oder ein Array mit den Schlüsseln label und capability.
- Schlüssel: die Tab-ID. Sie muss genau der
identsprechen, die du anregisterTab()übergibst. Nimm nur Kleinbuchstaben, Ziffern,_und-. - Schlichter String als Wert: das Label im Menü. Der Tab verlangt dann
manage_options, so wie jeder Tab, bevor es Berechtigungen pro Tab gab. - Array als Wert:
label(String, ohne Angabe die Tab-ID) undcapability(String, ohne Angabemanage_options). Jede einfache Berechtigung funktioniert, auch eigene, die dein Add-on vergibt.
Die Array-Form braucht Panel-Vertragsstufe 2 oder höher (EASY_SVG_PANEL_API).
Rückgabewert
Dieselbe Form, die du bekommen hast. Das Ergebnis wird mit (array) umgewandelt, gib also immer das Array zurück, ob verändert oder nicht.
Standardwert
array(
'settings' => __( 'Settings', 'easy-svg' ),
'library' => __( 'Icon library', 'easy-svg' ),
)
Beide sind schlichte Labels (auf Deutsch Einstellungen und Icon-Bibliothek), verlangen also manage_options. Die Reihenfolge im Array ist die Reihenfolge der Untermenü-Einträge, nach dem Eintrag Icons selbst.
Beispiele
Ein Menüeintrag für deinen Tab
Die einfachste Form: ein schlichtes Label, nur für Administratoren sichtbar.
add_filter( 'easy_svg_panel_menu_tabs', 'myaddon_menu_tabs' );
function myaddon_menu_tabs( $tabs ) {
$tabs['myaddon-report'] = __( 'SVG report', 'myaddon' );
return $tabs;
}
Ein Tab, den Redakteure öffnen dürfen
Mit der Array-Form verlangt der Tab upload_files. Redakteure und Autoren bekommen jetzt das Menü Icons, und das Panel zeigt ihnen genau diesen einen Tab. Was der Tab auf dem Server aufruft, prüft dieselbe Berechtigung.
add_filter( 'easy_svg_panel_menu_tabs', 'myaddon_menu_tabs' );
function myaddon_menu_tabs( $tabs ) {
$tabs = (array) $tabs;
$tabs['myaddon-report'] = array(
'label' => __( 'SVG report', 'myaddon' ),
'capability' => 'upload_files',
);
return $tabs;
}
add_action( 'rest_api_init', 'myaddon_routes' );
function myaddon_routes() {
register_rest_route(
'myaddon/v1',
'/report',
array(
'methods' => 'GET',
'callback' => 'myaddon_report',
'permission_callback' => function () {
return current_user_can( 'upload_files' );
},
)
);
}
Defensiv: schlichtes Label auf älteren Panels
Auf Vertragsstufe 1 gab es die Array-Form noch nicht. Weich dort auf ein schlichtes Label aus, das heißt: nur Administratoren.
add_filter( 'easy_svg_panel_menu_tabs', 'myaddon_menu_tabs' );
function myaddon_menu_tabs( $tabs ) {
$tabs = (array) $tabs;
$label = __( 'SVG report', 'myaddon' );
if ( defined( 'EASY_SVG_PANEL_API' ) && 2 <= (int) EASY_SVG_PANEL_API ) {
$tabs['myaddon-report'] = array(
'label' => $label,
'capability' => 'upload_files',
);
} else {
$tabs['myaddon-report'] = $label;
}
return $tabs;
}
Deinen Eintrag nach vorn stellen oder Einstellungen strenger machen
Die Reihenfolge im Array ist die Menüreihenfolge, du kannst also einfügen, wo du willst. Du kannst auch die Berechtigung eines freien Tabs anheben: Menü und Tab-Liste des Panels folgen ihr beide. Die freien REST-Routen hinter dem Tab prüfen trotzdem manage_options, du änderst also, was Leute sehen, nicht, was sie aufrufen könnten.
add_filter( 'easy_svg_panel_menu_tabs', 'myaddon_menu_tabs', 20 );
function myaddon_menu_tabs( $tabs ) {
$tabs = (array) $tabs;
// In einem Multisite-Netzwerk: Einstellungen nur für Super-Admins.
if ( is_multisite() && isset( $tabs['settings'] ) ) {
$tabs['settings'] = array(
'label' => __( 'Settings', 'easy-svg' ),
'capability' => 'manage_network_options',
);
}
// Unser Eintrag vor allen anderen.
return array( 'myaddon-report' => __( 'SVG report', 'myaddon' ) ) + $tabs;
}
So funktioniert es
Der Filter wird an genau einer Stelle angewendet, in der Funktion easy_svg_panel_menu_tabs() in includes/panel.php. Mehrere Teile des Panels rufen diese Funktion auf, dein Callback läuft also mehrmals pro Anfrage:
easy_svg_panel_tabs_for_user()macht aus jedem Eintraglabelpluscapability(ein schlichter String wird zumanage_options) und behält nur die Einträge, für diecurrent_user_can()wahr ist. Das nutzen das Menü, die Menü-Hervorhebung und das Rendern der Seite.easy_svg_panel_menu()hängt mit Priorität 9 anadmin_menu, auf jeder Admin-Seite. Darf der Benutzer keinen Tab sehen, wird nichts registriert. Sonst entsteht die Hauptseite Icons mit der Berechtigung des ersten sichtbaren Tabs, ein eigener Eintrag für sie und ein Untermenü-Eintrag pro sichtbarem Tab mit dem Slugeasy-svg-icons&tab=<id>.- Der Filter
submenu_filemarkiert den Eintrag des offenen Tabs als aktuell. Er schickt dentab-Wert aus der Adresse durchsanitize_key()und trifft nur IDs, die das unverändert überstehen. easy_svg_panel_tab_capabilities()undeasy_svg_panel_user_caps()füllentabCaps(Tab-ID zu Berechtigung, für jeden Eintrag) undcaps(Berechtigung zu wahr oder falsch für diesen Benutzer, plusmanage_options) inwindow.EasySvgPanelData.- Im Browser zeigt das Panel einen Tab nur, wenn
caps[ tabCaps[ id ] ]wahr ist. Eine Tab-ID, die nicht in deinem Filterergebnis steht, wird alsmanage_optionsnachgeschlagen.
Stolperfallen
- Ein Menüeintrag ist kein Tab. Zeichnet das Panel keinen Tab mit dieser ID, öffnet der Link das Panel auf seinem ersten Tab.
- Tabs fremder Add-ons zeichnet das Panel nur, solange Easy SVG Pro aktiv und lizenziert ist. So baut
src/panel/App.jsxdie Tab-Liste heute. Ohne diese Lizenz öffnet dein Eintrag den ersten Tab, und ein Benutzer, der nur deine eigene Berechtigung hat, sieht ein leeres Panel. Trag den Eintrag nur ein, wenn dein Tab auch gezeichnet wird (das Tutorial zeigt, wie). - Der Schlüssel muss genau der JavaScript-ID entsprechen. Die Berechtigungsprüfung im Browser geht über die Tab-ID. Bleib bei Kleinbuchstaben, Ziffern,
_und-, sonst markiert die Menü-Hervorhebung (diesanitize_key()nutzt) deinen Eintrag nie. - Nimm keine eingebauten IDs:
settings,library,sets,audit,configurator,licenceundupsellgehören Easy SVG und Easy SVG Pro. - Einen freien Eintrag zu entfernen versteckt den Tab nicht. Ohne Eintrag wird
settingsim Panel einfach alsmanage_optionsnachgeschlagen, Administratoren sehen den Tab also weiter. Willst du ihn vor jemandem verbergen, heb stattdessen seine Berechtigung an. - Die Berechtigung eines freien Tabs zu senken hilft nicht. Gibst du
librarydie Berechtigungedit_posts, sehen Redakteure den Tab, aber jede Anfrage aneasy-svg/v1antwortet mit 403, weil diese Routenmanage_optionsprüfen. - Gib immer das Array zurück. Der Wert wird mit
(array)umgewandelt: Ein zurückgegebener String wird zu einem Eintrag mit der ID0. - Nur reiner Text als Label. WordPress gibt Untermenü-Titel ohne Escaping aus, übergib also einen übersetzten String, nie Benutzereingaben oder Markup.
- Nimm einfache Berechtigungen.
current_user_can()wird ohne Objekt aufgerufen, Meta-Berechtigungen wieedit_postfunktionieren hier nicht. - Halte den Callback schlank. Er läuft auf jeder Admin-Seite beim Aufbau des Menüs und auf der Icons-Seite noch einmal. Vermeide Datenbankabfragen und externe Aufrufe darin.
Die Berechtigung, die du hier angibst, steuert, was Menü und Panel zeigen. Sie ist keine Zugriffsprüfung für Daten. Jede REST-Route, jede AJAX-Action und jedes Formular, das dein Tab nutzt, muss selbst current_user_can() aufrufen und sollte die wp_rest-Nonce prüfen, die das Panel mitschickt. Ein Benutzer kann deinen Endpunkt jederzeit direkt aufrufen, ganz ohne Panel.