Wo gehören zusätzliche Funktionen hin?

Ich lese in Tutorials im Web häufig, dass ich eine bestimmte Funktion in der functions.php meines Themes einbinden soll. Wird sie da nicht überschrieben? Was sind Code Snippets? Ist ein eigenes Plugin besser? Wann verwende ich Shortcodes? Kann ich Code nicht gleich über den Seiten-/Beitrags-Editor einfügen?

Faustformel: Themes sind Gestaltungsvorlagen,
Plugins enthalten funktionale Ergänzungen zu WordPress.

Wenn du die Gestaltung deiner Website funktional ergänzen möchtest, kannst du eine Funktion in der functions.php des Themes einfügen.

Eine direkte Änderung in einem Theme hat allerdings den Nachteil, dass deine Ergänzung beim nächsten Update des Themes überschrieben wird. Deshalb wird empfohlen, ergänzende Funktionen statt dessen in einem Child Theme unterzubringen (das ja selber schon eine Ergänzung des Themes ist und bei Updates nicht überschrieben wird).

Child Themes haben aber den Nachteil, dass du dich nun eigentlich bei jedem Update des Parent Theme erst einmal damit auseinandersetzen musst, welche Auswirkungen das Update auf das Child Theme haben könnte.

Exkurs: Nehmen wir an, du hast ein Child Theme erstellt und dabei – unabhängig von deinen eingefügten Funktionen in der functions.php – ein Template des Parent Theme kopiert und entsprechend eigener Wünsche angepasst. Nun stellt sich heraus, dass das Template des Parent Theme eine Sicherheitslücke hatte. Der Autor behebt diese Lücke mit einem Update. Da sich das Update aber nicht auf dein selbst kopiertes Template auswirkt, hast du nun ein Problem. Diese Problematik ist als Child-Theme-Dilemma bekannt.

Wer eine zusätzliche Funktion in die Gestaltungsvorlage einbauen, aus den o.g. Gründen aber kein Child Theme erstellen möchte, ist mit Code Snippets besser gestellt. Hier werden mit Hilfe eines Plugins Funktionen völlig unabhängig vom Theme eingebunden und machen die Erstellung eines Child Theme nur zu dem Zweck, eine Funktion einzufügen, überflüssig.

Weiterer Vorteil: Da Code Snippets unabhängig vom Theme sind, kannst du auch jederzeit die Gestaltungsvorlage wechseln, ohne die Funktionalität zu verlieren. Bestimmte Features – z.B. die Erstellung eines Custom Post Type (also einer selbst definierten Beitragsart) – sollten sowieso nicht im (Child-)Theme erfolgen, weil sonst ein späterer Themewechsel ohne Verlust von bereits erfassten Inhalten nicht möglich ist.

Nachteil von Code Snippets ist, dass du zur Verwendung von Code Snippets ein zusätzliches Plugin benötigst, mit dem die Code Snippets eingebunden werden. Unter Umständen sehen Webentwickler es auch kritisch, dass Kunden über das Plugin beliebige zusätzliche Funktionen einbinden könnten (und sich nachher über eine gehackte Website beschweren, weil ihr Code Sicherheitslücken produziert hat).

Ideal scheint, für Kunden ein eigenes Plugin zu erstellen und dort die Funktionalität einzubauen. Das hört sich komplizierter an, als es ist – das Plugin besteht schließlich auch nur aus einem Plugin Header mit ein paar Meta-Angaben, gefolgt von der Funktion die hinzugefügt werden soll.
Fertige Plugins verleiten Kunden weniger dazu, selbst gebastelten Code hinzuzufügen und sind natürlich auch unabhängig von Theme-Wechsel oder Theme-Updates. Als „Must Use“-Plugins können solche Kunden-Plugins sogar so eingebaut werden, dass sie nicht „versehentlich“ durch den Kunden deaktiviert werden.

Aus Sicherheitsgründen kannst du (ohne zusätzliche Plugins*) keinen PHP- und JavaScript-Code über den Beitrags- oder Seiteneditor (also über Beitrag/Seite bearbeiten) einfügen; sonst könnte jeder Anwender jede Benutzerregel umgehen. Wenn du nun aber doch an bestimmten Stellen deines Inhalts PHP-Code ausführen möchtest, kannst du dazu Shortcodes verwenden. Der in eckige Klammern gesetzte [shortcode] verhält sich wie ein Textbaustein, der im Frontend die (idealerweise in einem Plugin, sonst in einem Code Snippet) hinterlegte Funktion ausführt.

(* Ich sehe Plugins, mit denen du PHP-Code direkt im Seiten-/Beitragseditor einfügen kannst, ausgesprochen kritisch. Solche Plugins verleiten Nutzer dazu, ungeprüften PHP-Code per Copy/Paste zu übernehmen und arge Sicherheitslücken zu produzieren. Auch Benutzerrechte können damit ohne Probleme umgangen werden, was vielen Nutzer vermutlich gar nicht bekannt ist.)


Nachtrag: Torsten Landsiedel weist noch auf einen weiteren Vorteil von Code Snippets hin

Ein weiterer Vorteil von dem erwähnten Snippet-Plugin ist, dass der Code zusätzlich auf Frontend oder Backend beschränkt werden kann.

In einem eigenen Plugin kann/muss diese Beschränkung selbst gebaut werden.