kulturbanause Blog

Responsive Design, WordPress, Konzeption, HTML, CSS, JS & UX/UI …

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.

Workshops und Seminare von kulturbanause

Unsere Seminar-Termine für 2018 sind online!

Jetzt Tickets sichern!

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.

Das hier vorgestellte Snippet habe ich auf amberpanther.com gefunden. Diese Seite ist hier nicht verlinkt, da Google Maleware gefunden hat.

Jetzt bist du gefragt!

Hast du Anregungen, Ergänzungen, einen Fehler gefunden oder ist dieser Beitrag nicht mehr aktuell? Dann freuen wir uns auf deinen Kommentar.

Du kannst diesen Beitrag natürlich auch weiterempfehlen. Wir sind dir für jede Unterstützung dankbar!

Unterstützung bei WordPress-Projekten

Unsere WordPress Agentur ist auf die Entwicklung maßgeschneiderter WordPress-Themes und -Websites spezialisiert. Wenn du Unterstützung bei der Planung, Gestaltung und Entwicklung eines Projekts benötigst, helfen wir gerne weiter.
WordPress-Leistungsangebot →

Das könnte dich auch interessieren

12 Kommentare

  1. Marcos

    Verfasst am 23. Februar 2012 um 11:34 Uhr.

    Danke für die Infos!

  2. Oliver

    Verfasst am 23. Februar 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.

  3. Alex

    Verfasst am 27. Februar 2012 um 9: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 ;-)

    • Sabine

      Verfasst am 24. Juni 2013 um 12:51 Uhr.

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

  4. Jonathan

    Verfasst am 6. März 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?

  5. Dan

    Verfasst am 15. Mai 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

  6. Stefan Ständner

    Verfasst am 10. Juli 2012 um 1:41 Uhr.

    Hi Daniel,

    probier es mal mit :

    include(ABSPATH .$filepath);

    Lieben Gruß, Stefan

  7. Jerome Kessel

    Verfasst am 30. Mai 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

  8. inselfisch

    Verfasst am 16. April 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!

  9. Stephan H.

    Verfasst am 10. November 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

Kommentar verfassen

Dieser Blog lebt vom Feedback der Besucher! Also los, mach mit!
Bitte habe Verständnis dafür, dass Kommentare die mit dem Inhalt dieses Beitrags nichts zu tun haben, gelöscht werden.