WordPress: PHP-Dateien per Shortcode includieren

Innerhalb des WordPress-Editors lässt sich kein PHP-Code ausführen, was sinnvoll und nachvollziehbar ist, denn ansonsten gäbe es sichere einige zerschossene WordPress-Websites mehr. Ohne PHP könnt ihr allerdings auch keine externen Dateien inkludieren. Im Rahmen eines individuellen Themes seid ihr also, was die Möglichkeiten von PHP betrifft, auf die Bereiche vor und nach <?php the_content();?> begrenzt. Mit einem Shortcode holt ihr Includes in den Editor.

PHP-Includes per Shortcode ermöglichen

Wenn Ihr Includes innerhalb des Inhaltsbereichs einsetzen möchtet, gibt es eine simple Lösung über Shortcodes. Zunächst wird in der functions.php folgender Code eingesetzt:

// include files via shortcode
function include_file($atts) {
	extract(shortcode_atts(array('filepath' => 'NULL'), $atts));
	if ($filepath!='NULL' && file_exists(TEMPLATEPATH.$filepath)){
	ob_start();
	include(TEMPLATEPATH.$filepath);
	$content = ob_get_clean();
	return $content;
	}
}

add_shortcode('include', 'include_file');

Anschließend könnt ihr innerhalb des Editors mit folgendem Shortcode beliebige Dateien inkludieren. Der Pfad der gewünschten Datei ist dabei relativ zum Root des Theme-Ordners. Die folgende Beispieldatei deine-datei.php liegt also im gleichen Verzeichnis wie die styles.css

[include filepath='/deine-datei.php']

Bitte vorsichtig verwenden
Mit PHP-Code innerhalb des WordPress-Editors, könnt ihr eure Website stark beschädigen! Verwendet die hier vorgestellte Lösung also nur, wenn ihr wisst was ihr tut.

Geschrieben von Jonas

Benutzerbild

Jonas ist Gründer der Agentur kulturbanause und des kulturbanause Blogs. Er arbeitet an der Schnittstelle zwischen UX/UI Design, Frontend und Redaktion und hat zahlreiche Fachbücher und Video-Trainings veröffentlicht. Jonas Hellwig ist regelmäßig als Sprecher auf Fachveranstaltungen anzutreffen und unterstützt mit Seminaren und Workshops Agenturen und Unternehmen bei der Planung, der Gestaltung und der technischen Umsetzung von Web-Projekten.

Jonas Hellwig bei Xing

Feedback & Ergänzungen – 15 Kommentare

  1. Klaus Wilde
    schrieb am 28.05.2023 um 07:06 Uhr:

    Leider macht die functions.php einen Fehler: add_shortcode(‚include‘, ‚include_file‘);
    Wenn das funktionieren würde, wäre das super nach so vielen vergeblichen Versuchen.
    LG Klaus

    Antworten
  2. Jan
    schrieb am 28.04.2023 um 10:07 Uhr:

    Ich kann jetzt endlich meine PHP-Skripte weiterverwenden und alte Websites auf WP portieren!
    Funktioniert auch mit WordPress 6.2 noch perfekt!
    Danke für diese Anleitung!

    Antworten
  3. Heiko
    schrieb am 10.08.2019 um 11:54 Uhr:

    Hallo,
    es hat sich ein wenig was geändert, daher hier mal ein Update für alle die den Shortcode benötigen:

    Include Shortcode (Achtung -> nur wenn KEIN Child-Theme benutzt wird):

    ###############################################

    function phpInc($params = array()) {

    extract(shortcode_atts(array(
    ‚file‘ => ‚default‘
    ), $params));

    ob_start();
    include(get_theme_root() . ‚/‘ . get_template() . „/$file.php“);
    return ob_get_clean();
    }
    add_shortcode(‚include‘, ‚phpInc‘);

    ###############################################

    Für alle Mit Child-Theme -> Diesen Code verwenden (Die Änderung im Gegensatz zu oben: Zugriff auf den korrekten Pfad):

    ####################################

    function phpInc($params = array()) {
    extract(shortcode_atts(array(
    ‚file‘ => ‚default‘
    ), $params));

    ob_start();
    include(get_stylesheet_directory() . „/$file.php“);
    return ob_get_clean();
    }
    // register shortcode
    add_shortcode(‚include‘, ‚phpInc‘);

    ####################################

    In der Seite/Beitrag zu verwenden: [include file=’test‘] ohne .php am Ende. Die Datei liegt im Theme-Root.

    So – das wars, viel Spaß damit :-D

    Antworten
  4. Stephan H.
    schrieb am 10.11.2016 um 17:31 Uhr:

    Hallo,

    ist diese Form immer noch aktuell?

    Ich verwende WordPress 4.6.1 und zusätzlich den Visual Composer in der Version 4.12. Ich habe erst heute den Visual Composer upgedatet, seither funktioniert dieser Shortcode nicht mehr. Mit der älteren Version hat es noch funktioniert.
    Woran kann das liegen bzw. wie bekomme ich diesen wieder zum laufen?

    Danke und Gruß
    Stephan

    Antworten
  5. inselfisch
    schrieb am 16.04.2015 um 19:03 Uhr:

    Ist ja voll genial! Sowas suche ich seit Monaten. Natürlich muß man genau wissen was man tut, aber füe eine alte prozedurale Programmiererin wie mich ist das reines Glücks-Stöffchen.
    Many thanks fpr sharing!

    Antworten
  6. PHP im WordPress-Blog ausführen > Tipps, WordPress-Plugins > Blogprojekt
    schrieb am 24.10.2013 um 11:16 Uhr:

    […] ob_end_clean(); } return $text; }Man kann auch PHP-Includes ermöglichen, wie auf kulturbanause.de geschildert wird.Um diesen Weg zu nehmen, sollte man sich mit WordPress und PHP aber sehr gut […]

    Antworten
  7. Jerome Kessel
    schrieb am 30.05.2013 um 11:25 Uhr:

    Hallo Jonas,

    ich habe dein Snippet so wie gezeigt eingebaut und es funktionoiert prima.
    Habe jetzt versucht ein Formular mit Feldüberprüfung auf die selbe Weise auf der Page zu zeigen. Das Formular wird auch angezeigt, nur bei der Feldüberprüfung wird es geleert und es werden keine Daten an den externen Server gesendet.

    Lieben Dank für eine Antwort
    Gruß Jérôme

    Antworten
  8. Stefan Ständner
    schrieb am 10.07.2012 um 01:41 Uhr:

    Hi Daniel,

    probier es mal mit :

    include(ABSPATH .$filepath);

    Lieben Gruß, Stefan

    Antworten
  9. Dan
    schrieb am 15.05.2012 um 10:43 Uhr:

    Hi, super, nach sowas suche ich (bin bisher HTML coder und liebe Includes)

    allerdings kann ich kein PHP und bekomme es noch nicht zum Laufen…

    wie kann ich zB unter dem WP-root Folfer (wp-admin, wp-content etc) meine Includes in den neuen Ordner /includes/ legen und von dort aus aufrufen?

    wie müßte ich den Code

    include(TEMPLATEPATH.$filepath);

    anpassen ??

    Kann die Datei auch auf zB .html ebnden, oder m,uss es .php sein?

    Lieben Dank im Voraus

    Daniel

    Antworten
  10. Jonathan
    schrieb am 06.03.2012 um 20:39 Uhr:

    Wenn ich beispielsweise nun eine Video URL in die PHP-Datei schreibe, wird die URL zwar über den hier beschriebenen Weg in mein Artikel eingebunden, jedoch wandelt WordPress die Video-URL (YouTube, Vimeo etc) nicht automatisch in das eingebunde Iframe-Video um, wie wir es seit jüngeren WP-Versionen kennen.

    Der User gibt in ein Inputfeld (Custom Field) die Video URL, die bei Artikel-Veröffentlichung als eingebundenes Video sofort angezeigt werden soll. Auch wenn der User in den Texteditor die Video-URL eintragen kann, möchte ich den Umweg über Customfiels gehen. Der dafür notwenige PHP-Code wird also über die hier beschriebene Shortcode-Variante eingebunden. Dennoch wird lediglich die URL in Textform angezeigt, statt wie gewünscht, die automatische anzeige des Videos.

    Kompliziert oder doch einfach? Ich stecke hier fest.

    Wie kann ich eine Video-URL, ob durch shortcode oder nicht, in jeden neuen Beitrag einbinden, ohne dass der User die URL oder ShortCode löschen kann?

    Antworten
  11. Alex
    schrieb am 27.02.2012 um 09:42 Uhr:

    Ein wenig einfacher, aber dafür auch weniger flexibel als die Lösung von Oliver.
    Man könnte auch basename() auf $filepath anwenden. So ist sichergestellt, dass man in keine anderen Verzeichnisse springen kann. ../../../ würde dann beispielsweise entfernt werden und nur der letzte Teil des Pfades genommen werden (der Dateiname). Und so ist es nicht möglich in ein übergeordnetes Verzeichnis zu springen. Nachteil: es ist nicht möglich die einzubindende Datei in ein Unterverzeichnis von TEMPLATEPATH zu legen.

    Das Beispiel was Oliver genannt hat:

    /../../../../../../../etc/passwd würde zu passwd werden. Und da diese Datei nicht im TEMPLATEPATH existiert, scheitert die file_exists-Abfrage und es wird keine Datei eingebunden.

    Ich will nicht sagen, dass diese Lösung besser ist, als die von Oliver – sie ist nur simpler einzubauen ;-)

    Antworten
    • Sabine
      schrieb am 24.06.2013 um 12:51 Uhr:

      Wie genau würde der Eintrag in der functions.php dann aussehen?
      (Danke schon mal ;))

      Antworten
  12. Oliver
    schrieb am 23.02.2012 um 16:52 Uhr:

    Oh oh, gefährliches Pflaster – jetzt mal abseits der Fehlerquellen! TEMLATEPATH kann ja definiert sein, aber das heißt nicht, dass man nicht aus dem Ordner raus kommt. Wenn man mehrere Autoren hat oder die Shortcodes für Kommentare erlaubt, baut man da ein echtes Sicherheitsproblem ein. Es ging ja auch als Templatepath

    /var/www/user1/wp-content/template/twentyten

    Und ich hänge das dran:

    /../../../../../../../etc/passwd

    Besser wäre es, zu prüfen, ob die Datei wirklich im Pfad liegt, also z. B. mit opendir eine Schleife durch das Zielverzeichnis machen und daraus ein array zu bauen, dass die erlaubten Namen enthält. Ist der Name nicht dabei, wird es nicht included. Das wäre die bessere Variante.

    Antworten
  13. Marcos
    schrieb am 23.02.2012 um 11:34 Uhr:

    Danke für die Infos!

    Antworten

Kommentar zu dieser Seite

Wir freuen uns über Anregungen, Ergänzungen oder Hinweise zu Fehlern. Wir lesen jeden Eintrag, veröffentlichen aber nur, was den Inhalt sinnvoll ergänzt.

WordPress-Projekte mit kulturbanause

Wir wissen wovon wir reden. Wir setzen WordPress seit über 10 Jahren erfolgreich ein und realisieren maßgeschneiderte Websites auf Basis dieses großartigen CMS.

WordPress-Leistungsangebot →

Schulungen von kulturbanause

Wir bieten Seminare und Workshops zu den Themen Konzept, Design und Development. Immer up-to-date, praxisnah, kurzweilig und mit dem notwendigen Blick über den Tellerrand.

Übersicht Schulungsthemen →