WordPress: PHP-Dateien per Shortcode includieren
Mit einem WordPress-Shortcode können im Editor-Bereich Funktionen ausgeführt oder Theme-Bestandteile geladen werden. Wir zeigen, wir eine Datei inkludiert wird.

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.
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
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!
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
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
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!
[…] 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 […]
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
Hi Daniel,
probier es mal mit :
include(ABSPATH .$filepath);
Lieben Gruß, Stefan
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
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?
@Jonathan: Hilft dir das hier weiter? http://wpgarage.com/code-snippets/embedding-html-and-iframes-in-wordpress-2/
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 ;-)
Wie genau würde der Eintrag in der functions.php dann aussehen?
(Danke schon mal ;))
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.
Danke für die Infos!