Spielereien mit WordPress 4.7 – Shortcodes überschreiben

WordPress 4.7 – Shortcodes
Keine Kommentare

WordPress 4.7 steht in den Startlöchern. Daher lohnt es sich bereits jetzt, ein bisschen damit zu experimentieren. Zum Teil direkt im Code und zum Teil in Form von ein paar Gedankenexperimenten, weil viele Features (Stand heute) noch nicht fertig sind. In diesem Teil überschreiben wir vorhandene Shortcodes.

Theme gekauft, Plug-ins installiert … und schon sind neue Shortcodes da. Leider funktionieren manche nicht, wie der Kunde es sich wünscht. Um sie anzupassen, bietet WordPress 4.7 einen neuen tollen Weg.

Shortcodes in WordPress 4.7

Mit WordPress 4.7 kommen die Filter pre_do_shortcode_tag und do_shortcode_tag. Ersterer wird vor jedem, wirklich jedem Shortcode aufgerufen und erlaubt, einen Shortcode on the fly zu überschreiben. Im Code von WordPress heißt es: „Filters whether to call a shortcode callback. Passing a truthy value to the filter will effectively short-circuit the shortcode generation process, returning that value instead.“

Dieser Short-Circuit (oft auch Early Exit genannt) erlaubt es also, über einen Wert ähnlich true jeden Shortcode zu überschreiben. Das kann alles von einer großen Zahl bis zu einem ganzen HTML-String sein. Selbst ein String mit einem Leerzeichen gilt und würde einen Shortcode abschalten:

add_filter(
  'pre_do_shortcode_tag',
  function () {
    return ' '; // Leerzeichen
  }
);

Schon sind alle Shortcodes abgeschaltet. Das ist natürlich Unsinn, deutet aber an, wie mit dem Filter manche Shortcodes umgangen werden können. Alle Snippets hier lassen sich ebenso auf den do_shortcode_tag-Filter anwenden. Er bekommt die Ausgabe eines jeden Shortcodes mit auf den Weg und darf diese ein letztes Mal manipulieren, bevor sie raus zum Client geht.

Dieser Artikel ist der erste von fünf in unserer WordPress-Themenwoche. In anderen Artikeln geht es um allgemeine Neuerungen & Proposals, Bulk Actions, Theme-Vererbung und ein eigenes Event-System mit WP_Hook.

Shortcodes je Kontext ändern

Das Tolle an dem pre_do_shortcode_tag-Filter ist, dass er je nach Kontext Shortcodes unterdrücken oder komplett anders aussehen lassen kann. Nehmen wir zum Beispiel einen [user_profile]-Shortcode, der ein Formular zum Ändern des eigenen Profils anbietet. Diese Funktion ist fix in ein Plug-in oder Theme gegossen, und ein Stakeholder möchte eine Änderung: Der Benutzer darf erst seine Daten bearbeiten, wenn er freigeschaltet worden ist. Super einfach:

add_filter(
  'pre_do_shortcode_tag',
  function ( $ausgabe, $shortcode ) {

    if ( 'user_profile' !== $shortcode ) {
      // nicht der "user_profile" shortcode => ignorieren
      return $ausgabe;
    }

    if ( get_user_meta( get_current_user_id(), 'aktiviert', true ) ) {
      // Benutzer ist aktiv => Shortcode machen lassen
      return $ausgabe;
    }

    // Es bleibt über: Richtiger Shortcode & Benutzer nicht freigeschaltet
    return 'Sie sind noch nicht freigeschaltet!';

  },
  10,
  2
}

Das ist fast schon mehr Dokumentation als Code. Erst wird geprüft, ob der Filter überhaupt für den gewünschten Shortcode aufgerufen wurde. Ist dies nicht der Fall, dann wird die Eingabe direkt wieder zurückgeschickt. Soll dennoch der Shortcode [user_profile] gefiltert werden, kommt die nächste Hürde: Es wird geprüft, ob der Benutzer bereits freigeschaltet wurde. Ist das bereits geschehen, dann darf das Benutzerprofil so bleiben wie es ist.

One more thing …

Ein Fall bleibt nun noch übrig: Es ist der Shortcode [user_profile] gesetzt, aber der Benutzer ist bisher nicht freigeschaltet. Dann stellt die Funktion eine einfache Meldung zusammen und übergibt diese im letzten return an WordPress. Dies hebelt die eigentliche Implementierung des Shortcodes aus und gibt anstelle des Formulars nur den Einzeiler aus.

WordPress Spezial

Entwickler Magazin Spezial Vol. 10: WordPress
Alles rund um WordPress im Entwickler Spezial Vol. 10 – ab 18.11.2016 im Handel.

Shortcodes aushebeln ist keine neue Trickserei in WordPress. Es kann natürlich ein Shortcode deaktiviert und mit einem Wrapper drumherum wieder aktiviert werden. Hier ist das Problem allerdings, dass der richtige Zeitpunkt abgefangen werden muss. Mit den neuen Filtern kann der Entwickler schon sorgenfreier Shortcodes aus Plug-ins oder Themes manipulieren.

Die Sahnehaube wäre an dieser Stelle ein dynamischer Filter wie pre_do_shortcode_{$tag}, der je nach Shortcode aufgerufen wird. Dann bleibt sogar die Unterscheidung, ob aktuell der richtige Shortcode gefordert wird, erspart. Hierzu hat mir der Entwickler gesagt, dass es einfach nicht Teil seines Szenarios war und es bestimmt nicht viel kostet, die einzelnen Hooks entscheiden zu lassen, ob sie aktiv werden müssen (vgl. user_profile !== $shortcode oben im Code). Mehr noch, es lassen sich mehrere Shortcodes in einer Funktion behandeln, was sicherlich auch seinen Charme hat.

Nach diesem Leckerbissen beschäftigen wir uns in unserer WordPress-Woche morgen mit der neuen Theme-Vererbung in WordPress 4.7.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu:
X
- Gib Deinen Standort ein -
- or -