window.EasySvgPanel.registerTab()
Registriert einen eigenen Tab im Icons-Panel von Easy SVG: eine ID, eine render-Funktion mit React-Element und optional Label, Bereich, Reihenfolge und Icon.
JavaScript · Easy SVG · Status: Stabil
registerTab() fügt dem Icons-Panel eine eigene Seite hinzu. Du gibst eine ID und eine Funktion mit, die liefert, was der Tab zeigt, und das Panel setzt den Tab in seine linke Seitenleiste, in den Bereich deiner Wahl. Registrierst du dieselbe ID noch einmal, ersetzt die neue Fassung die alte.
Tabs anderer Add-ons zeichnet das Panel nur, solange Easy SVG Pro aktiv und lizenziert ist. Auf einer Site mit dem freien Plugin allein nimmt registerTab() deinen Tab zwar an, das Panel zeigt ihn aber nicht. Muss dein Add-on ohne Pro funktionieren, bring deine Icons stattdessen mit registerCollections() in die Icon-Bibliothek, dafür gibt es diese Bedingung nicht.
Verwendung
window.EasySvgPanel.registerTab( {
id: 'myaddon-report', // Pflicht
render: ( ctx ) => element, // Pflicht
label: 'SVG report',
area: 'inspect',
order: 30,
icon: 'audit',
} );
Wann du es brauchst
- Dein Add-on braucht eine ganze Seite im Icons-Panel: einen Bericht, ein Werkzeug, ein eigenes Einstellungsformular.
- Du willst diese Seite neben den Tabs von Easy SVG statt auf einer eigenen Admin-Seite, mit derselben Optik und demselben Menü.
- Zusammen mit
easy_svg_panel_menu_tabssoll der Tab über das Menü Icons erreichbar sein und, wenn du willst, auch für Benutzer ohnemanage_options.
Wann nicht:
- Um Icons aus deinem Add-on zu zeigen. Die Icon-Bibliothek kann sie über
registerCollections()neben den Icons der Site auflisten. - Auf Sites, auf denen Easy SVG Pro nicht lizenziert ist, denn dort wird der Tab nicht gezeichnet (siehe Hinweis oben).
- Um festzulegen, wer den Tab nutzen darf. Die Berechtigung wird in PHP angegeben, nicht hier.
Parameter
Eine eindeutige ID für den Tab. Sie wird zum Wert von ?tab= in der Adresszeile und muss dem Schlüssel entsprechen, den du in easy_svg_panel_menu_tabs nutzt, denn das Panel schlägt die Berechtigung des Tabs über diese ID nach. Nimm Kleinbuchstaben, Ziffern, _ und -, mit dem Slug deines Add-ons davor. Die IDs library, settings, upsell, sets, audit, configurator und licence sind vergeben.
Wird mit einem Argument, ctx, aufgerufen und muss etwas liefern, das React rendern kann: ein Element, einen String oder null. Gib ein Element deiner eigenen Komponente zurück, etwa ( ctx ) => wp.element.createElement( MyTab, { ctx } ), und halte Zustand, Effekte und Anfragen in dieser Komponente. Das Objekt ctx enthält:
restRoot(String): die Wurzel der REST-API mit Schrägstrich am Ende, etwahttps://example.com/wp-json/. Bei einfachen Permalinks ist es die Form mit?rest_route=/, häng deine Route also daran an, statt die URL selbst zu bauen.nonce(String): einewp_rest-Nonce. Schick sie als HeaderX-WP-Nonce.proActive(Boolean): Easy SVG Pro ist installiert und aktiv.proLicensed(Boolean): Easy SVG Pro meldet eine gültige Lizenz.iconsEnabled(Boolean): die Icon-Bibliothek ist eingeschaltet.iconBlock(Boolean): der Icon-Block von WordPress ist verfügbar (Icon-Registry von WordPress 7.1).maxMbCeiling: die höchste Upload-Grenze, die die Site erlaubt, in Megabyte. Der Wert läuft durchwp_localize_script()und kann deshalb als String ankommen, pack ihn inNumber().onActivate(Funktion oder undefined): wechselt zum Lizenz-Tab von Pro, wenn es einen gibt.
Der Text in der Seitenleiste. Ohne Angabe die ID. Übersetz ihn mit wp.i18n.__() und deiner eigenen Textdomain. Er ist unabhängig vom Menü-Label, das du in PHP angibst, halte also beide gleich.
In welchen Abschnitt der Seitenleiste der Tab kommt. Einer von icons, design, inspect, security oder setup, angezeigt als Icons, Gestalten, Prüfen, Sicherheit und Einrichtung. Ein fehlender oder unbekannter Wert setzt den Tab nach setup. Vertragsstufe 2. Der ältere Name group wird weiter als Alias gelesen, wenn er einen dieser Werte enthält.
Die Position innerhalb des Bereichs, kleinere zuerst. Standard 50. Zur Orientierung: Die Tabs von Easy SVG nutzen 10 und 20, der Pro-Werbetab 90. Bei Gleichstand bleibt die Reihenfolge der Registrierung.
Das Icon in der Seitenleiste. Entweder ein Schlüsselwort aus dem Set des Panels (settings, library, sets, configurator, audit, licence, packs, features, styles, bulk, history, upsell) oder deine eigene Zeichnung als Kinder eines svg-Elements mit viewBox="0 0 24 24", fill="none", stroke="currentColor" und Strichstärke 1,5. Ein unbekanntes Schlüsselwort zeichnet ein leeres Kästchen. Vertragsstufe 2.
Rückgabewert
Nichts. Wird der Tab abgelehnt, gibt es weder Fehler noch Rückgabewert. Prüf bei Bedarf mit window.EasySvgPanel.get( id ).
Standardwert
| Feld | Wenn du es weglässt |
|---|---|
label | die Tab-ID |
area | setup |
order | 50 |
icon | leeres Icon-Kästchen |
| Berechtigung | manage_options, außer easy_svg_panel_menu_tabs nennt für diese ID eine andere |
Beispiele
Ein einfacher Tab
Ohne Build-Schritt: wp.element ist das React, das WordPress mitbringt und das Panel nutzt. Reih diese Datei über easy_svg_panel_enqueue mit dem Panel-Handle, wp-element und wp-i18n als Abhängigkeiten ein.
( function () {
const panel = window.EasySvgPanel;
if ( ! panel ) {
return;
}
const { createElement: el } = window.wp.element;
const { __ } = window.wp.i18n;
function HelloTab() {
return el( 'p', null, __( 'Hello from my add-on.', 'myaddon' ) );
}
panel.registerTab( {
id: 'myaddon-hello',
label: __( 'Hello', 'myaddon' ),
area: 'setup',
order: 60,
render: () => el( HelloTab ),
} );
} )();
Ein Tab, der Daten von deiner REST-Route lädt
ctx bringt alles mit, was eine Anfrage braucht. Die Komponente bricht ihre Anfrage ab, wenn der Benutzer den Tab wechselt, weil das Panel Tabs aushängt, die nicht offen sind.
( function () {
const panel = window.EasySvgPanel;
if ( ! panel ) {
return;
}
const { createElement: el, useEffect, useState } = window.wp.element;
const { __ } = window.wp.i18n;
function ReportTab( { ctx } ) {
const [ rows, setRows ] = useState( null );
const [ error, setError ] = useState( '' );
useEffect( () => {
const controller = new AbortController();
fetch( ctx.restRoot + 'myaddon/v1/report', {
credentials: 'same-origin',
headers: { 'X-WP-Nonce': ctx.nonce },
signal: controller.signal,
} )
.then( ( response ) =>
response.ok ? response.json() : Promise.reject( new Error( response.statusText ) )
)
.then( ( data ) => setRows( Array.isArray( data ) ? data : [] ) )
.catch( ( e ) => {
if ( 'AbortError' !== e.name ) {
setError( e.message );
}
} );
return () => controller.abort();
}, [ ctx.restRoot, ctx.nonce ] );
if ( error ) {
return el( 'p', { role: 'alert' }, error );
}
if ( null === rows ) {
return el( 'p', null, __( 'Loading…', 'myaddon' ) );
}
return el(
'ul',
null,
rows.map( ( row ) => el( 'li', { key: row.id }, row.title ) )
);
}
panel.registerTab( {
id: 'myaddon-report',
label: __( 'SVG report', 'myaddon' ),
area: 'inspect',
order: 30,
icon: 'audit',
render: ( ctx ) => el( ReportTab, { ctx } ),
} );
} )();
Defensiv: ältere Panels und ein eigenes Icon
area und ein eigenes icon brauchen Vertragsstufe 2. Auf Stufe 1 funktioniert der Tab trotzdem und landet unter Einrichtung.
( function () {
const panel = window.EasySvgPanel;
if ( ! panel || 'function' !== typeof panel.registerTab ) {
return;
}
const { createElement: el } = window.wp.element;
const level = Number( panel.api || 1 );
const tab = {
id: 'myaddon-report',
label: 'SVG report',
render: () => el( 'p', null, 'Report' ),
};
if ( 2 <= level ) {
tab.area = 'inspect';
tab.order = 30;
// Ein Haken, gezeichnet auf dem 24 mal 24 Raster des Panels.
tab.icon = el( 'path', { d: 'M5 12l4 4L19 7' } );
}
panel.registerTab( tab );
} )();
So funktioniert es
registerTab() selbst legt das Objekt nur in einer Map nach id ab und benachrichtigt das Panel. Alles andere passiert, wenn das Panel rendert (src/panel/App.jsx):
- Sammeln. Das Panel beginnt mit seinen eigenen Tabs (
library,settings), dem Pro-Katalog (sets,audit,configurator,licence) und dem Tabupsell. Registrierte Tabs mit jeder anderen ID kommen als zusätzliche Tabs dazu, aber nur, wennEasySvgPanelData.proLicensedwahr ist. Ein registrierter Tab mit einer Katalog-ID ersetzt den gesperrten Platzhalter dieses Pro-Tabs, sobald die Lizenz gültig ist (den Tablicencejederzeit, damit man einen Schlüssel eingeben kann). - Normalisieren. Jeder zusätzliche Tab bekommt seinen Bereich (
area, sonst das altegroup, sonstsetup), seine Reihenfolge (Number( order ), wenn endlich, sonst 50) und sein Label (label, sonst die ID). - Nach Berechtigung filtern. Ein Tab bleibt nur, wenn der Benutzer
caps[ tabCaps[ id ] ]hat, mitmanage_optionsals Rückfall für IDs ohne Eintrag ineasy_svg_panel_menu_tabs. - Sortieren. Nach Bereich (icons, design, inspect, security, setup), dann nach Reihenfolge.
- Rendern. Die Seitenleiste zeichnet pro Tab einen Knopf. Für den Inhalt ruft das Panel bei jedem eigenen Rendern
render( ctx )für jeden Tab auf, die Tabs-Komponente hängt aber nur den offenen Tab ein (lazyMountundunmountOnExit). Ein Tabwechsel hängt den vorherigen aus. - Den offenen Tab wählen. Der Wert
?tab=in der Adresszeile gewinnt; eine ID, die nicht in der Liste steht, öffnet den ersten Tab. Ein Klick auf einen Tab schreibt?tab=mithistory.replaceState()neu.
Stolperfallen
- Keine Pro-Lizenz, kein Tab. Siehe Hinweis oben. Trag deinen Menüeintrag nur ein, wenn der Tab auch gezeichnet wird, sonst öffnet der Eintrag den ersten Tab.
- Keine Hooks direkt in
render. Das Panel ruftrender( ctx )für jeden Tab bei jedem Rendern als schlichte Funktion auf. Hooks dort gehörten zur Komponente des Panels und gehen kaputt, sobald sich die Zahl der Tabs ändert. PackuseState,useEffectund Anfragen in eine Komponente und gib ein Element davon zurück. - Halte
renderbillig und ohne Nebenwirkungen. Es läuft auch für geschlossene Tabs. - Beim Tabwechsel geht Zustand verloren. Der Tab wird ausgehängt. Halte ungespeicherte Eingaben kurz, speichere sie, oder leg sie außerhalb der Komponente ab.
- Brich deine Anfragen im Cleanup ab. Sonst kommt eine langsame Antwort an, nachdem der Benutzer weg ist, und überschreibt womöglich neueren Zustand.
- Mit
SCRIPT_DEBUGlaufen Effekte doppelt. Das Panel rendert in ReactsStrictMode; mit dem Entwicklungs-Build von React wird jeder Effekt eingehängt, ausgehängt und wieder eingehängt. - Nimm das React von WordPress.
wp.elementoderwindow.React. Eine in dein Script gebündelte React-Kopie macht Hooks kaputt. renderdarf keinen DOM-Knoten liefern. Willst du mit schlichtem DOM-Code zeichnen, gib ein Element mitref-Callback zurück und füll den Knoten dort.- Kollisionen.
settings,libraryoderupsellzu registrieren wird ignoriert.sets,audit,configuratoroderlicencezu registrieren übernimmt einen Pro-Tab. Die letzte Registrierung einer ID gewinnt. ctx-Werte aus PHP sind nicht immer typisiert.maxMbCeilingkann ein String sein; die Booleans sind schon umgewandelt.
Dein Tab ist Admin-Oberfläche und läuft mit den Rechten dessen, der ihn öffnet. React escaped Text, den du renderst, dangerouslySetInnerHTML aber nicht: Steck nie SVG oder HTML aus einer Anfrage hinein, wenn es nicht vorher auf dem Server durch einen Sanitizer wie easy_svg_sanitizer() gelaufen ist. Jede Route, die dein Tab aufruft, muss selbst current_user_can() prüfen; die Berechtigung in easy_svg_panel_menu_tabs blendet den Tab nur aus.