Shortcodes – nützliche Helfer

Deutsch ist eine schöne Sprache. Durch geschickte Aneinanderreihung von Begriffen bilden wir Ausdrücke, die sehr präzise Dinge beschreiben. Allerdings entstehen dabei Wortungetüme wie das Bundes­aus­bildungs­förderungs­gesetz, das uns unter seiner Abkürzung BAföG besser bekannt ist. Wer vermutet, dass sich hinter der Abkürzung NMU eine Nahrungs­mittel­unver­träg­lich­keit versteckt oder BUZ die Abkürzung für die Berufs­unfähig­keits­zusatz­ver­sicherung ist? Letztere sollte vorsorglich abgeschlossen werden, wenn man ähnlich lange Begriffe häufig schreiben muss; Tippfehler sind vorprogrammiert.

Zum Glück gibt es ja Textbausteine. Textbausteine sind so alt wie die Textverarbeitung auf Computern und können nicht nur lange und kompliziert zu schreibende Wörter, sondern auch ganze Textpassagen ersetzen – Formatierung inklusive.

Auch WordPress verwendet Textbausteine, nur heißen sie hier Shortcodes. Bereits in WordPress Version 2.5 wurde die Shortcode API geschaffen, mit der die Eingabe wiederkehrender Textabschnitte vereinfacht werden soll.

Die API funktioniert so, dass in einem Plugin ein Shortcode einmalig festgelegt wird und dann an beliebiger Stelle in Seiten und Beiträgen verwendet werden kann. Die Eingaben erfolgt in eckigen Klammern, also z.B. als [helloworld]. Wird die Seite oder der Beitrag anschließend von Webseitenbesuchern aufgerufen, wird der Beitragsinhalt gefiltert und dabei jeder Shortcode durch den in einer Funktion hinterlegten Text ersetzt.

Aber werfen wir doch einen Blick hinter die Kulissen:

[wpforum] – einfache Shortcodes

Nehmen wir an, wir möchten gerne an verschiedenen Textstellen den Link zum deutschsprachigen WordPress Support-Forum angeben. Dabei möchten wir außerdem angeben, dass Suchmaschinen dem Link nicht folgen sollen. Der Link sieht also so aus:

<a href="de.wordpress.org/support" rel="nofollow">WordPress Support-Forum</a>Code-Sprache: HTML, XML (xml)

Damit wir uns künftig bei der Eingabe nicht mehr die Finger verhaken, definieren wir einen Shortcode. Die von der API zur Verfügung gestellte Funktion heißt add_shortcode() und verfügt über zwei Parameter,

  1. die Bezeichnung des Shortcodes und
  2. die Funktion, die durch diesen Shortcode ausgeführt werden soll.

Als Bezeichnung für den Shortcode verwenden wir einen leicht zu merkenden Begriff: wpforum.

Die Funktion nennen wir kp_forumlink, wobei wir eine Vorsilbe vorangestellt haben (hier kp_ für … – genau, krautpress.de), damit es später nicht zu Konflikten mit gleichen Funktionsnamen in anderen Plugins kommt.

Unser Code sieht jetzt so aus:

add_shortcode( 'wpforum', 'kp_forumlink' );Code-Sprache: PHP (php)

Als nächstes fügen wir die Funktion hinzu, die ausgeführt werden soll, wenn der Shortcode in einem Beitrag gefunden wird:

function kp_forumlink() {
	$ausgabe = '<a href="de.wordpress.org/support" rel="nofollow">WordPress Support-Forum</a>';
	return $ausgabe;
}Code-Sprache: PHP (php)

Die erste Zeile unserer Funktion weist hier den Text, den wir gerne einsetzen möchten, einer Variablen $ausgabe zu.

Die nachfolgende Anweisung return $ausgabe; gibt diesen Text an die Funktion zurück, die den Text filtert und aufbereitet.

Häufiger Anfängerfehler ist übrigens, statt return die PHP-Funktion echo zu verwenden. Dies führt zu einer vorzeitigen Ausgabe (englisch echo) bei Aufruf der Funktion, während doch eigentlich eine Übergabe (englisch return) an die Funktion zur Filterung des Textes gewünscht ist; mit echo erscheint der Text an der falschen Stelle.

Merksatz: Bei Shortcodes nie echo verwenden.

Mittlerweile sieht unser Code folgendermaßen so aus:

add_shortcode( 'wpforum', 'kp_forumlink' );
function kp_forumlink() {
	$ausgabe = '<a href="de.wordpress.org/support" rel="nofollow">WordPress Support-Forum</a>';
	return $ausgabe;
}Code-Sprache: PHP (php)

Diesen Code können wir nun erst einmal in der functions.php unseres Child Themes anhängen und gleich ausprobieren, ob nach Eingabe von [wpforum] in einer Seite oder Beitrag im Frontend der vollständige Link ausgegeben wird.

[hello name=“Dolly”] – Shortcodes mit Attributen

Die Verwendung von add_shortcode() mit Angabe der Shortcode-Bezeichnung und einer Funktion, die den eigentlichen Text zurückgibt, ist verblüffend einfach.

Allerdings müssten wir nach dem, was wir bisher besprochen haben, zu jeder unterschiedlichen Text-Variante einen neuen Shortcode definieren. Die Shortcode API erlaubt aber auch die Verwendung von Attributen, die Eingabewerte an die Funktion durchreichen:

Bei [hello name="Dolly"] ist hello der Name des Shortcodes, während name ein Attribut ist und Dolly der Wert, der an die Shortcode-Funktion übergeben werden soll.

Als erstes müssen wir wieder einen neuen Shortcode hinzufügen und ihm eine Funktion zuweisen:

add_shortcode( 'hello', 'kp_sag_hallo' );Code-Sprache: PHP (php)

Attribute und die zugehörigen Werte werden in WordPress als assoziatives Array abgespeichert. $atts ist die Variable für das Array aller verwendeten Attribute, name der Index eines bestimmten Attributs und Dolly der diesem Attribut zugewiesene Wert, der bei Abruf von $atts[name] ausgegeben wird.

function kp_sag_hallo( $atts ) {
	$ausgabe = "Oh, hello, $atts[name]";
	return $ausgabe;
}Code-Sprache: PHP (php)

Vorgabewerte für Shortcode-Attribute

Bei meinem letzten Beispiel habe ich (aus didaktischen Gründen) ein wenig geschummelt. Gibt der Anwender Attribute oder deren Werte nicht mit ein und der im Beitrag eingefügte Shortcode lautet nur [hello] oder [hello name=], gibt die Funktion kp_sag_hallo() einen Fehler aus, weil es keinen Vorgabewert gibt.

Hier kommt eine letzte wichtige WordPress-Funktion der Shortcode API ins Spiel:

shortcode_atts( $defaults_array, $atts )Code-Sprache: PHP (php)

Der erste Parameter dieser Funktion ($defaults_array) beschreibt Vorgabewerte, während der zweite Parameter angibt, welche Variable die Shortcode-Attribute enthält.

Als Beispiel wollen wir hier “Dolly” als Vorgabewert für das Attribut name festlegen:

function kp_sag_hallo( $atts ) {
	$werte = shortcode_atts( array(
		'name' => 'Dolly',
	), $atts);
	$ausgabe = "Oh, hello, $werte[name]"
	return $ausgabe;
}Code-Sprache: PHP (php)

Wird im Beitrag nun der Shortcode [hello name="Sweatheart"] eingegeben, wird Oh, hello, Sweatheart ausgegeben. Lautet der Shortcode nur [hello] bzw. [hello name=], wird der Vorgabewert verwendet und Oh, hello Dolly ausgegeben – natürlich ohne Fehlermeldung.

Durch die Nutzung von Shortcodes mit Attributen lassen sich auch komplexe Funktionen in Beiträge und Seiten einfügen. Auch Plugins wie das beliebte Kontaktformular-Plugin Contact Form 7 nutzen Shortcodes, z.B. um ein Kontaktformular im Inhalt einer Seite einzubetten:

[contact-form-7 id="1042" title="Kontaktformular"]Code-Sprache: HTML, XML (xml)

Umschließende Shortcodes

Der Vollständigkeit halber möchte ich noch erwähnen, dass Shortcodes aus so verwendet werden können, dass sie Text umschließen. (Wem es hier zu kompliziert wird, der mag diesen Abschnitt gerne überspringen.)

Umschließende Shortcodes sind z.B. hilfreich, wenn Textabschnitte in bestimmte ein HTML-Gerüst eingebettet werden soll, etwa um Text mehrspaltig oder in verschiedene Tabs zu setzen. Dabei werden dem Shortcode keine Attribute weitergegeben, sondern der Inhalt selbst wird in Shortcodes verschachtelt:

[wichtig]Dieser Text soll hervorgehoben werden![/wichtig]Code-Sprache: HTML, XML (xml)

Zur Formatierung haben wir dazu bereits im Stylesheet eine CSS-Klasse .wichtig angelegt:

.wichtig {
	color: red;
	background-color: yellow;
	font-weight: bold;
	padding: 20px;
}Code-Sprache: CSS (css)

Jetzt definieren wir einen neuen Shortcode und übergeben in der zugehörigen Funktion den Parameter $content:

add_shortcode( 'wichtig', 'kb_wichtig' );
function kb_wichtig( $atts, $content = null ){
	$ausgabe = '<div class="wichtig">' . $content . '</div>';
	return $ausgabe;
}Code-Sprache: PHP (php)

Ähnlich wie bei den Attributen wird mit $content = null für den Fall vorgesorgt, dass die weitergegebene Variable $content leer ist. Existiert jedoch zwischen dem einführenden und schließenden Shortcode ein Inhalt, wird dieser als Wert verwendet.

Wer nicht selber programmieren, aber die zahlreichen Möglichkeiten zur Formatierung nutzen möchte, die sich hieraus ergeben, sollte sich das Plugins Shortcodes Ultimate ansehen. Dieses Plugin erweitert WordPress mit mehr als 40 Shortcodes, die unter anderem Slider und Akkordeon-Animationen, Lightbox-Effekte und QR-Codes hinzufügen.

Shortcodes auch in Widgets nutzen

Shortcodes funktionieren prima in Seiten und Blogbeiträgen, aber nicht ohne weiteres in Text-Widgets. Möchte man Shortcodes auch in Text-Widgets verwenden, hilft folgender, ergänzender Code in der functions.php oder einem Plugin:

add_filter( 'widget_text', 'do_shortcode' );Code-Sprache: PHP (php)

Spannende Sache: mal rasch ein eigenes Plugin schreiben

Noch dabei? Prima. Denn jetzt sollten wir noch eine Kleinigkeit korrigieren. Bisher haben wir unseren Shortcode in der functions.php des Themes platziert. Da gehört er aber eigentlich aus zwei Gründen nicht hin:

  1. gehen solche Ergänzungen spätestens bei der nächsten Aktualisierung oder einem Wechsel des Themes verloren,
  2. wird hier zusätzliche Funktionalität und Gestaltung vermischt, wodurch unsere WordPress-Installation schwierig zu warten ist.

Besser ist es, ein eigenes Plugin zu schreiben.

Wer bei dem Gedanken an ein eigenes Plugin mit erhöhtem Blutdruck reagiert und so etwas schon gar nicht “mal eben” erstellt, sollte sich freuen: Es ist alles viel einfacher, als es zunächst klingt.

Das Plugin, das wir nun schreiben, unterscheidet sich von unseren bisherigen Code-Beispielen nur dadurch, dass wir in einem so genannten Plugin-Header ein paar Meta-Angaben zu unserem Plugin hinzufügen:

<?php
/*
Plugin Name: Shortcode-Sammlung
Description: Nützliche Shortcodes für meine Website
Author: Bego Mario Garde
*/Code-Sprache: PHP (php)

Direkt unterhalb dieser Angaben können wir nun beliebig viele Shortcodes hinzufügen, wobei wir darauf achten, dass Shortcode-Namen und -Funktionen nicht doppelt vorkommen.

Die fertige Plugin-Datei sieht z.B. so aus:

<?php
/*
Plugin Name: Shortcode-Sammlung
Description: Nützliche Shortcodes für meine Website
Author: Bego Mario Garde
*/

// auch in Text-Widgets verwenden
add_filter( 'widget_text', 'do_shortcode' );

// Shortcode "Oh, hello …(Name)"
add_shortcode( 'hello', 'kp_sag_hallo' );

function kp_sag_hallo( $atts ) {
	$werte = shortcode_atts( array(
		'name' => 'Dolly',
	), $atts);

	$ausgabe = "Oh, hello, $werte[name]";
	return $ausgabe;

}Code-Sprache: PHP (php)

Die Datei speichern wir als kp-shortcodes.php in einem Verzeichnis kp-shortcodes ab und komprimieren das Verzeichnis anschließend als .zip-Datei. Nun können wir das Plugin in einer lokalen Testumgebung ausprobieren.

“Houston, wir haben ein Problem.”

Unter Umständen gibt es jetzt doch noch einen kleinen Nervenkitzel. Denn wenn bei der Programmierung des Plugins etwas schief gelaufen ist, bekommen wir nach der Installation (Menü Plugins → Installieren) eine Fehlermeldung oder – noch schlimmer! – sogar einen komplett leeren Bildschirm (White Screen of Death) angezeigt.

Wie an anderer Stelle beschrieben, hilft in solchen Fällen vor allem Ruhe. Erst einmal sollte, sofern Fehlermeldung angezeigt werden, die angegebene Zeilennummer notiert werden. Dadurch vereinfacht sich meistens die Fehlersuche; oft fehlt an der angegebenen Stelle nur ein Komma oder eine Klammer und das Problem lässt sich schnell beheben.

Um die Testumgebung aber erst mal wieder ans Laufen zu bekommen, hilft es schon, in der Testumgebung das Verzeichnis kp_shortcodes zu löschen. Bei dem nächsten Zugriff auf das Backend wird das fehlerhafte Plugin automatisch als deaktiviert erkannt und die Arbeit kann fortgesetzt werden.

Wer sich vor diesen zuletzt genannten Schritten doch ein wenig fürchtet und “nichts kaputt machen” möchte, sollte sich das Plugin Code Snippets anschauen. Mit diesem Plugin können die hier verwendeten Code-Snippets in Eingabemasken eingegeben werden. Ist der Code fehlerhaft, deaktiviert das Plugins den Code selbständig und weist mit Fehlermeldungen auf mögliche Schwachstellen hin.

Nachteil von Shortcodes

Shortcodes sind einfach einzurichten und können den Arbeitsaufwand beim Schreiben von Blogbeiträgen deutlich reduzieren. Shortcodes haben aber auch kleine Nachteile, die ich nicht unterschlagen möchte.

Nachteil Nr. 1: Fragmente im Text

Wird die Shortcode-Funktion gelöscht, verbleiben im Frontend statt des erwarteten Textes unschöne Shortcode-Anweisungen (z.B. [hello name="Dolly"]). Mit Plugins wie Search & Replace können Shortcodes aber wieder gegen herkömmlichen Text ausgetauscht werden.

Nachteil Nr. 2: Kein visuelles User Interface

Während WordPress bereits für viele Formate vom Youtube-Video über Twitter bis zu WordPress-Blogbeiträgen eine Einbettung-Funktion anbietet, mit der die Inhalte direkt im Backend angezeigt werden, erscheinen Shortcodes im Backend weiterhin nur als nichtsagender Text in eckigen Klammern. Hier gibt es mit dem Projekt Shortcake (Shortcode UI) einen recht vielversprechenden Ansatz für ein visuelles User Interface.

Nachteil Nr. 3: Double Content in Suchmaschinen

Ein Kunde bat mich um Hilfe bei der Erstellung eines Shortcodes, der eine Sammlung von Schlüsselwörtern zu seinem Berufszweig und Geschäftsort wiedergeben sollte. Ziel war, das Suchmaschinenranking zu erhöhen, indem der Shortcode unter jeden Beitrag gesetzt wurde. Solchen Schabernack erkennen Suchmaschinen allerdings. Ganze Textabschnitte, die gezielt wiederholt verwendet werden, um das Suchmaschinenranking zu beeinflussen erreichen aber genau das Gegenteil. Shortcodes sind sehr sinnvoll, wenn häufig genutzte Begriffe damit effizienter eingegeben oder Funktionen eingefügt werden. Als „SEO-Tool“ sind sie aber sicher der falsche Ansatz.

Welche Verwendungszwecke fallen Dir ein?
Mir bleibt für heute nur ein [VG] und [biba].

11 Kommentare zu “MFG mit freundlichen Grüßen

  1. Und bei Shortcode im Shortcode muss es .do_shortcode($content). heißen statt .$content.

    z.B. bei:
    [wichtig]Dieser Text [hello] soll hervorgehoben werden![/wichtig]

    • Hallo Phillip,

      vielen Dank für deinen ergänzenden Hinweis. Wenn innerhalb von umschließenden Shortcodes ein weiterer Shortcode ausgeführt werden soll, muss der Inhalt über die Funktion do_shortcode() ausgegeben werden – also mit . do_shortcode( $content ) . Ich hatte mich bei dem Code-Beispiel am Codex orientiert, in dem auch zunächst die einfachere Fassung gezeigt, dann aber zusätzlich auf diese Besonderheit hingewiesen wird.

      Viele Grüße, Bego

  2. Das finde ich jetzt sehr lustig – auch wir haben uns gestern früh in der Firma mit dem Thema Shortcodes auseinandergesetzt und im Prinzip das erarbeitet, was Bego hier sehr schön strukturiert darlegt (danke dafür).

    Als Beispiele fallen mir ein: [IBAN] oder auch [BIC].
    Auch könnte man damit einen langen Firmennamen handlicher machen. Wenn z.B. der große Chemiekonzern in Ludwigshafen öfters in einem Artikel vorkommt, könnte der Autor wechselweise «BASF» und «[BASF]» benutzen. Einmal bleibt die Abkürzung stehen, im anderen Falle wird’s ausgeschrieben. Wahlweise auch mit Parameter, um den Eintrag verlinkt auszugeben: «[BASF link]».

    Oder man baut per Shortcode in den Fließtext eine Zahl ein, die man in der functions.php dynamisch bestimmen, berechnen, aus einem SQL-Statement gewinnen oder sonstwoher nehmen kann: «Unser aktueller Zählerstand ist [DYNWERT]»

    • Hallo Christian,

      die IBAN ist ein sehr gutes Beispiel, vor allem wenn sich die Bankverbindung später ändern könnte.
      Hier wäre nur ein einzige Änderung in der Shortcode-Funktion nötig, um die IBAN an ganz vielen Stellen zu ändern.

      Viele Grüße, Bego

  3. Last week, Bego published a post about WordPress shortcodes. It is a pretty good write up, but there is one little thing I don’t quite like: the illustrated use case for an enclosing shortcode (i.e., one that wraps around other content). In this post, I will try to explain why that is, and what you should be using instead.
    Shortcodes
    The Shortcode API in WordPress is a fairly versatile and powerful means. In essence, it lets you execute a predefined PHP function anywhere in your post content, in order to (dynamically) generate even more content.
    Configuration
    By passing in (hard-coded) attribute values, you can provide input or better: configuration data for the function. And since it gets executed in the current request, you have access to almost anything you might need inside the function (thanks to WordPress being a global player 😉 ).
    This means you can act upon one or more predefined values passed in as well as the current context, such as the post ID, or the visitor’s IP address. Of course, you can also execute any other PHP function, and thus behave (i.e., render) differently for logged in and not logged in users, respect whether or not the post has a specific category, or if this is a single post view or some archive.
    Use Cases
    There is an infinite set of diverse use cases for shortcodes. Say, you want to display some value (or piece of content) in a number of posts. And you don’t want to find and edit all of these posts in case that value ever changes. You could use a shortcode here that simply returns the value as it is right now. If it ever were to change, you’d only have to do this in one place: inside the shortcode callback.
    You have a members-only area on your website? And you want to tease people so they sign up? Use a shortcode that checks if the user is logged in (or maybe even the user role), and show the full content for members, and an excerpt of what there is, followed by a sign-up form, for guests or non-members.
    More than worth mentioning: shortcodes can be nested. So you can make an enclosing shortcode wrap around some content including another (possibly enclosing) shortcode. This extends what you can do with shortcodes even further.
    What’s in my opinion not an ideal use case for a shortcode, though, is binding some sort of formatting or semantics to a specific piece of content. And this is exactly what Bego used as example for an enclosing shortcode: marking some content important.
    TinyMCE Custom Formats
    What do you do if you want a word in your content to be strong, or red, or a headline? You use the according button or input of your TinyMCE editor.
    So, when you want to say “Hey, you word over there. You should be wrapped in a <kbd> HTML tag.”, or “You, last sentence. You should be marked ‘important’.”, you really shouldn’t be doing this by creating individual shortcodes for that. Instead, you should extend your editor with what is missing right now. Luckily, TinyMCE, the WYSIWYG editor in your WordPress back end, easily allows for this.
    Enabling Custom Formats
    In order to eventually make use of any custom formats, once added, you first have to enable the according UI element: a dropdown that is hidden by WordPress per default.
    Enabling the dropdown can easily be done by hooking into the appropriate filter, mce_buttons_2, like so:
    add_filter( 'mce_buttons_2', function ( array $buttons = [] ) {

    return array_unique( array_merge( [ 'styleselect' ], $buttons ) );
    }, 20 );

    The above code simply inserts (or moves, if present) the dropdown as first element in your TinyMCE toolbar (i.e., the second button bar, which you first might have to make visible by using the according button). Your TinyMCE should be looking similar to this now:
    TinyMCE formats dropdown.
    Adding Custom Formats
    Now that we prepared the editor UI, we can go ahead and add some custom formats. We do this by means of another filter hook: tiny_mce_before_init.
    Let’s just add the according formats for the two examples from before: an inline <kbd> HTML tag, and an important block-level <div> HTML tag.
    add_filter( 'tiny_mce_before_init', function ( array $settings = [] ) {

    $formats = [];
    if ( ! empty( $settings['style_formats'] ) && is_string( $settings['style_formats'] ) ) {
    $formats = json_decode( $settings['style_formats'] );
    if ( ! is_array( $formats ) ) {
    $formats = [];
    }
    }

    $formats[] = [
    'title' => __( '<kbd> Tag', 'some-textdomain-here' ),
    'inline' => 'kbd',
    ];

    $formats[] = [
    'title' => __( 'Important', 'some-textdomain-here' ),
    'block' => 'div',
    'classes' => 'important',
    ];

    $settings['style_formats'] = json_encode( $formats );

    return $settings;
    } );

    The above code basically only adds the necessary configuration for our two new formats. Since we do not want to delete potentially existing formats, though, and since these are stored as a (JSON) string, we will have to do some checking and type casting first.
    Displaying Custom Formats
    One benefit of using custom formats is that they do not have one of the … shortcode shortcomings: missing display in the WordPress back end. When you look at a shortcode in your editor, you have no idea about what it will render on the front end. Custom formats, however, are a completely different beast.
    Making custom formats visible in the back end is possible in two ways.
    Inline CSS
    Along with the format definition, you can also specify inline CSS for the according HTML tag. We do this now for the <kbd> format by changing its definition from before like so:
    $formats[] = [
    'title' => __( '<kbd> Tag', 'some-textdomain-here' ),
    'inline' => 'kbd',
    'styles' => [
    'padding' => '2px 4px',
    'background-color' => '#333',
    'color' => '#eee',
    'white-space' => 'nowrap',
    ],
    ];

    Having this inline style definition in place, we can now directly see in the Visual editor in our WordPress back end how the custom format will be rendered:
    TinyMCE displaying the <kbd> format inline style.
    When we have a look at the according markup, we see the following:
    Press <kbd style="padding: 2px 4px; background-color: #333333; color: #eeeeee; white-space: nowrap;">ANY</kbd> key to continue.
    This means that the HTML tag has been created with a style attribute containing all CSS rules according to what we specified in the form of key—value pairs in the format style definition (with colors given in 6-digit hex notation).
    Editor CSS
    The second, and both more widely used and the suggested, possibility to style custom formats is using a real CSS file (e.g., in your theme). We now want to style our important pieces of content according to the following CSS:
    div.important {
    margin: 1em 0;
    border: .5em solid #000;
    padding: 1em .5em;
    background-color: #eee;
    color: #333;
    font-weight: 400;
    }

    In case the above CSS code is included in our theme styles, anything that has been marked important will render as desired; but only on the front end. To make the styling available to the back end as well, we have to enqueue a separate CSS file by using the add_editor_style() function.
    We therefore create a new file, editor-style.css, in the root of our theme, and put the above CSS code inside. Then, we enqueue the file like so:
    add_action( 'admin_init', function () {

    add_editor_style();
    } );

    The above code can go in our theme’s functions.php file, for example.
    We then mark the sentence from before to be important, and save the post. Having refreshed our Edit Post page, we should see something like this:
    TinyMCE displaying the important format thanks to an editor style CSS file.
    Advanced Usage
    TinyMCE offers way more than the two simple use cases from before. You can, for example, nest formats (e.g., have a non-clickable Highlight element that has various clickable highlight formats as children). This could, for example, look like so:
    $formats[] = [
    'title' => __( 'Highlight', 'some-textdomain-here' ),
    'items' => [
    [
    'title' => __( 'Highlight Primary', 'some-textdomain-here' ),
    'inline' => 'span',
    'classes' => 'highlight highlight-primary',
    ],
    [
    'title' => __( 'Highlight Secondary', 'some-textdomain-here' ),
    'inline' => 'span',
    'classes' => 'highlight highlight-secondary',
    ],
    // ...
    ],
    ];

    Furthermore, you can not only use an HTML tag to be the inline or block target, but an arbitrary selector instead:
    $formats[] = [
    'title' => __( 'Call to Action', 'some-textdomain-here' ),
    'selector' => 'a.button',
    'classes' => 'call-to-action',
    ];

    The above format, for example, can only be applied to an anchor element with the button class (which could have been added by yet another format before, of course).
    Convinced?
    So, did you get my point? Is there one? 😀
    Do you see it the same way?
    Or did I miss something here, or simply didn’t get right?
    Please, let me know!

  4. Hallo Krauts!

    Zugegeben, der Kommentar kommt etwas spät, aber ich war die letzten Tage etwas unpässlich. 😉

    Im Beispiel mit dem umschließend Shortcode hat sich ein Fehler eingeschlichen, denn die Signatur muss natürlich ( array $atts, $content = null ) sein, d.h. als erster Parameter wird weiterhin ein Attribut-Array erwartet.

    Zum Beispiel an sich habe ich aber ein paar Anmerkungen, denn das ist nicht wirklich ein geeigneter Einsatzzweck für einen Shortcode – meiner Meinung nach. Ich habe das mal in einem eigenen Post zusammengetragen. Würde mich über deine/eure Meinung freuen!

    Viele Grüße,
    Thorsten

    • Hallo Thorsten,

      vielen Dank für deine Hinweise. Den fehlenden Funktionsparameter habe ich ergänzt – das war mir glatt durchgegangen. Sorry.
      Bei dem Beispiel für den umschließenden Shortcode habe ich wohl zu sehr vereinfacht; ich wollte den Beitrag nicht noch länger machen. Dein Beitrag zeigt, dass es für so eine vergleichsweise einfache Formatierung eine wesentlich elegantere Lösung gibt. Auch dafür vielen Dank!

Kommentare sind geschlossen.