easy_svg_rename_icon()
Ändere den sichtbaren Namen eines gespeicherten Icons, ohne Slug oder SVG anzufassen, und bekomm ein Statuswort zurück. Sicher auch ohne unfiltered_html.
Funktion · Easy SVG · Status: Stabil
easy_svg_rename_icon() ändert den Namen, den ein Icon in der Bibliothek und in der Auswahl des Icon-Blocks zeigt. Der Slug bleibt, jedes Template, jeder Shortcode und jeder gespeicherte Block, der das Icon nutzt, läuft also weiter. Und das SVG bleibt heil, was ein einfaches wp_update_post() nicht garantiert.
Verwendung
easy_svg_rename_icon( int $id, string $label ): string
Wann du es brauchst
- Ein Add-on oder eine eigene Admin-Seite lässt Icons umbenennen.
- Ein Migrationsskript räumt Icon-Namen in großer Zahl auf (zum Beispiel
arrow_left_24pxzuArrow left). - Du übersetzt oder vereinheitlichst die Namen, die Redakteure in der Auswahl sehen.
Wann nicht:
- Um den Slug zu ändern. Der Slug ist die Adresse des Icons und wird absichtlich nie geändert: Themes und gespeicherte Icon-Blöcke tragen ihn. Brauchst du einen anderen Slug, füg das Icon unter dem neuen Namen neu hinzu und pass die Stellen an, die es nutzen.
- Um den Namen nur in der Auswahl des Editors auf einer Website zu ändern. Ändere dafür
labelineasy_svg_registrable_icons, der gespeicherte Titel bleibt dann.
Parameter
Die Beitrags-ID des Icons (Beitragstyp esw_icon). Wird in eine Ganzzahl umgewandelt. Null, negative Werte, fehlende Beiträge und Beiträge jedes anderen Typs antworten alle mit not_found.
Der neue Name, schon als reiner Text bereinigt. Die Funktion speichert ihn so, wie er kommt: Sie trimmt nicht und bereinigt nicht. Ein leerer String antwortet mit no_label, ein String aus Leerzeichen ist nicht leer und wird gespeichert. Ruf vorher sanitize_text_field() auf, wie es die REST-Route des Plugins tut.
Rückgabewert
Ein Wort. Die Funktion gibt nie ein WP_Error zurück und wirft nie eine Ausnahme.
renamed: Der Titel ist gespeichert und die zwischengespeicherte Icon-Liste verworfen.not_found: Es gibt keinenesw_icon-Beitrag mit dieser ID.no_label:$labelist ein leerer String.failed:wp_update_post()gab einen Fehler oder 0 zurück.
Beispiele
Einfach
$state = easy_svg_rename_icon( $icon_id, sanitize_text_field( $label ) );
Ein Formular verarbeiten
function myplugin_handle_icon_rename() {
check_admin_referer( 'myplugin_rename_icon' );
if ( ! current_user_can( 'manage_options' ) ) {
wp_die( esc_html__( 'You are not allowed to rename icons.', 'myplugin' ) );
}
$id = isset( $_POST['icon_id'] ) ? absint( $_POST['icon_id'] ) : 0;
$label = isset( $_POST['label'] ) ? sanitize_text_field( wp_unslash( $_POST['label'] ) ) : '';
$state = easy_svg_rename_icon( $id, $label );
wp_safe_redirect( add_query_arg( 'myplugin_rename', $state, wp_get_referer() ) );
exit;
}
add_action( 'admin_post_myplugin_rename_icon', 'myplugin_handle_icon_rename' );
Namen in großer Zahl aufräumen
foreach ( easy_svg_stored_icons() as $icon ) {
$clean = ucfirst( trim( str_replace( array( '_', '-' ), ' ', preg_replace( '/_?\d+px$/', '', $icon['label'] ) ) ) );
if ( '' !== $clean && $clean !== $icon['label'] ) {
easy_svg_rename_icon( $icon['id'], sanitize_text_field( $clean ) );
}
}
Jeder Aufruf verwirft den Icon-Cache. Lass das also einmal laufen (zum Beispiel per WP-CLI mit wp eval-file), nicht bei jeder Anfrage. easy_svg_stored_icons() ist ein interner Helfer und nicht Teil der zugesagten API, halte solche Skripte also einmalig.
Defensiv: die Vertragsversion prüfen
Die Funktion gibt es seit EASY_SVG_ICONS_API 2 (Easy SVG 5.4.0).
if ( defined( 'EASY_SVG_ICONS_API' ) && EASY_SVG_ICONS_API >= 2 && function_exists( 'easy_svg_rename_icon' ) ) {
$state = easy_svg_rename_icon( $icon_id, $label );
}
Die Funktion prüft weder Berechtigungen noch Nonces und speichert das Label so, wie es kommt. Das Label erscheint später im Admin und in der Auswahl des Editors, es muss also reiner Text sein: Lass sanitize_text_field() darüber laufen und prüf eine Berechtigung, bevor du die Funktion für eine Anfrage aufrufst. Die REST-Route des Plugins verlangt manage_options, der Beitragstyp esw_icon selbst ist mit edit_theme_options geschützt.
So funktioniert es
Warum es die Funktion gibt statt eines einfachen wp_update_post():
- kses.
wp_update_post()speichert die ganze Zeile neu, also läuft auchpost_contentwieder durchcontent_save_pre. Der kses-Filter von WordPress kennt kein SVG und leert das Icon für jeden Benutzer ohneunfiltered_html(zum Beispiel Administratoren in einer Multisite). Die Funktion schaltet kses genau für diesen einen Schreibvorgang ab, falls es an war, und in einemfinally-Block wieder an. - Cache. Die Icon-Liste liegt einen Tag lang im Transient
easy_svg_icons.easy_svg_forget_icons()erhöht die Optioneasy_svg_icons_versionund löscht den Transient, die nächste Anfrage zeigt also den neuen Namen im Icon-Block. Die Funktion wird direkt aufgerufen, weil der Hooksave_post_esw_icon, der das auch täte, nur registriert ist, solange die Icon-Bibliothek eingeschaltet ist. - Slug. Es wird nur
post_titleübergeben,post_namekann sich also nicht bewegen.
Stolperfallen
- Ein Titel ohne Buchstaben oder Ziffern. Das Umbenennen klappt, aber
easy_svg_update_icon_markup()leitet aus dem Titel einen Namen ab und antwortet bei einem Titel wie!!!oder einem in nicht lateinischer Schrift mitrefused. Behalte Titel, aus denensanitize_title()einen gültigen Slug macht, wenn das Icon später eine neue Grafik bekommen soll. - Labels nur aus Leerraum.
' 'wird gespeichert. Trimme vor dem Aufruf. - Eingaben mit Slashes. Schick den Wert vor dem Bereinigen durch
wp_unslash(). Die Funktion slasht ihn fürwp_update_post()selbst, also nicht doppelt slashen. - Hooks laufen.
save_post,save_post_esw_iconundpost_updatedfeuern wie bei jeder Aktualisierung. - Templates zeigen den Titel nicht.
easy_svg_icon()gibt die Zeichnung aus. Der Titel erscheint nur als Ersatz-aria-label, wenn dudecorativefalse ohne Label übergibst.