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 & Schulungen von kulturbanause
Intensive Trainings mit hohem Praxisbezug.
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
13 Kommentare
Kommentar verfassen
Marcos
Verfasst am 23. Februar 2012 um 11:34 Uhr.
Danke für die Infos!
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.
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 vonTEMPLATEPATH
zu legen.Das Beispiel was Oliver genannt hat:
/../../../../../../../etc/passwd
würde zupasswd
werden. Und da diese Datei nicht imTEMPLATEPATH
existiert, scheitert diefile_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 ;))
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?
Jonas Hellwig
Verfasst am 6. März 2012 um 21:01 Uhr.
@Jonathan: Hilft dir das hier weiter? http://wpgarage.com/code-snippets/embedding-html-and-iframes-in-wordpress-2/
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
Stefan Ständner
Verfasst am 10. Juli 2012 um 1:41 Uhr.
Hi Daniel,
probier es mal mit :
include(ABSPATH .$filepath);
Lieben Gruß, Stefan
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
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!
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
Heiko
Verfasst am 10. August 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