Hier ist was ich habe
Ich habe kein Glück, wenn ich finde, wie man einfach eine Datei mit einem Shortcode in den Inhaltseditor einfügt.
Zum Beispiel, wenn ich form.php in meine Kontaktseite aufnehmen wollte, wie würde ich das mit einem Shortcode erreichen?
Im Folgenden wird versucht, ohne Erfolg zu arbeiten.
Jede Hilfe wäre dankbar!
// Shortcode implementation
function magic_stuff($atts) {
// turn on output buffering to capture script output
ob_start();
// include file (contents will get saved in output buffer)
include(TEMPLATEPATH.'/wp-content/themes/grainandmortar/inc_static/test.php');
// save and return the content that has been output
$content = ob_get_clean();
return $content;
}
//register the Shortcode handler
add_shortcode('magic', 'magic_stuff');
Ich habe dazu Code aus einem alten Blog-Beitrag geändert und erlaubt, dass auch Abfragezeichenfolgen an die Datei angehängt werden.
Der ursprüngliche Kredit geht an amberpanther.com , und es stellt sich heraus, dass sie auch ein Plug-in daraus gemacht haben.
//create the shortcode [include] that accepts a filepath and query string
//this function was modified from a post on www.amberpanther.com you can find it at the link below:
//http://www.amberpanther.com/knowledge-base/using-the-wordpress-shortcode-api-to-include-an-external-file-in-the-post-content/
//BEGIN amberpanther.com code
function include_file($atts) {
//if filepath was specified
extract(
shortcode_atts(
array(
'filepath' => 'NULL'
), $atts
)
);
//BEGIN modified portion of code to accept query strings
//check for query string of variables after file path
if(strpos($filepath,"?")) {
$query_string_pos = strpos($filepath,"?");
//create global variable for query string so we can access it in our included files if we need it
//also parse it out from the clean file name which we will store in a new variable for including
global $query_string;
$query_string = substr($filepath,$query_string_pos + 1);
$clean_file_path = substr($filepath,0,$query_string_pos);
//if there isn't a query string
} else {
$clean_file_path = $filepath;
}
//END modified portion of code
//check if the filepath was specified and if the file exists
if ($filepath != 'NULL' && file_exists(get_stylesheet_directory_uri() . "/" . $clean_file_path)){
//turn on output buffering to capture script output
ob_start();
//include the specified file
include(TEMPLATEPATH.$clean_file_path);
//assign the file output to $content variable and clean buffer
$content = ob_get_clean();
//return the $content
//return is important for the output to appear at the correct position
//in the content
return $content;
}
}
//register the Shortcode handler
add_shortcode('include', 'include_file');
//END amberpanther.com code
//shortcode with sample query string:
//[include filepath="/get-posts.php?format=grid&taxonomy=testing&term=stuff&posttype=work"]
Ich habe meine so eingestellt, dass sie aus dem Stylesheet uri abruft (damit es mit untergeordneten Themen und dergleichen funktioniert), aber Sie können diesen Code einfach so anpassen, dass er von überall abgerufen wird (einschließlich Plug-In-Verzeichnissen), oder ihn ganz entfernen und einfach den vollständigen Pfad verwenden beim einbinden der datei. Sie können sogar eine Bedingung mit einem Auslöserzeichen am Anfang hinzufügen, die angibt, dass ein bestimmter Pfad verwendet werden soll, der auf dem ersten Zeichen des Dateinamens basiert, z. B. die Verwendung eines "#" für das Vorlagenverzeichnis usw.
Ich verwende es, um eine Datei mit dem Namen get-posts.php abzurufen, die sich in meinem Vorlagenverzeichnis befindet und die Ausgabe verschiedener Posts basierend auf einer Reihe von Parametern formatiert, die in der Abfragezeichenfolge angegeben sind. Es erspart mir, spezielle Vorlagen zu benötigen, da ich die Datei einbinden, ein Format senden und die Posts mit dem in der Datei get-posts.php angegebenen Markup ausgeben kann.
Außerdem können Kunden benutzerdefinierte Post-Typen in bestimmten Formaten in aktuelle Blog-Posts ziehen. Dies ist sehr praktisch.
Lassen Sie mich wissen, wenn Sie Klarheit über irgendetwas brauchen.
Hier ist eine andere Möglichkeit, get_template_part
von wordpress zu verwenden
function include_file($atts) {
$a = shortcode_atts( array(
'slug' => 'NULL',
), $atts );
if($slug != 'NULL'){
ob_start();
get_template_part($a['slug']);
return ob_get_clean();
}
}
add_shortcode('include', 'include_file');
beispiele:
[include slug="form"]
[include slug="sub-folder/filename_without_extension"]
Es gibt einen Fehler in der von @adedoy bereitgestellten Lösung, da $ slug nie definiert wird. Das hat bei mir funktioniert:
function include_file($atts) {
$atts = shortcode_atts(
array(
'path' => 'NULL',
), $atts, 'include' );
ob_start();
get_template_part($atts['path']);
return ob_get_clean();
}
add_shortcode('include', 'include_file');
Ich stellte fest, dass der ursprünglich von den AmberPanther-Leuten geschriebene Include-Code nicht so gut für mich funktionierte, und fand ein weiteres WordPress-Plugin, das fast dasselbe leistet. Es heißt Include Me, von Stefano Lissa. Die Verwendung ist so ziemlich, dass Sie Ihren Pfad zu der Datei ausgehend vom Stammverzeichnis Ihrer Website schreiben.
So würden Sie zum Beispiel in Ihrer WordPress-Seite schreiben:
[includeme file="wp-content/themes/your-theme/code/example-code.php"]
und in deine functions.php Datei würdest du folgendes einfügen:
<?php
if (is_admin()) {
include dirname(__FILE__) . '/admin.php';
} else {
function includeme_call($attrs, $content = null) {
if (isset($attrs['file'])) {
$file = strip_tags($attrs['file']);
if ($file[0] != '/')
$file = ABSPATH . $file;
ob_start();
include($file);
$buffer = ob_get_clean();
$options = get_option('includeme', array());
if (isset($options['shortcode'])) {
$buffer = do_shortcode($buffer);
}
} else {
$tmp = '';
foreach ($attrs as $key => $value) {
if ($key == 'src') {
$value = strip_tags($value);
}
$value = str_replace('&', '&', $value);
if ($key == 'src') {
$value = strip_tags($value);
}
$tmp .= ' ' . $key . '="' . $value . '"';
}
$buffer = '<iframe' . $tmp . '></iframe>';
}
return $buffer;
}
// Here because the funciton MUST be define before the "add_shortcode" since
// "add_shortcode" check the function name with "is_callable".
add_shortcode('includeme', 'includeme_call');
}
natürlich würde ich auch empfehlen, nur das Plugin zu installieren, damit Sie die Vorteile von Updates nutzen können. https://wordpress.org/plugins/include-me/
Ok, zuerst würde ich die Ausgabepufferung aufheben.
Zweite Änderung:
include(TEMPLATEPATH.'/wp-content/themes/grainandmortar/inc_static/test.php');
Zu
include( get_stylesheet_directory() . '/inc_static/test.php');
Endlich,
Lesen Sie die Dokumentation hier: https://codex.wordpress.org/Shortcode_API
Sie müssen etwas zurückgeben, wenn Ihre test.php etwas nicht in einer Mehrwegform ausgibt, werden Sie eine schlechte Zeit haben.
Stellen Sie also sicher, dass test.php folgende Aktionen ausführt:
$output = "STUFF"; // a variable you could return after include.
// or
function test() {
// do stuff
return $stuff; // a function that returns a value that you can call after include.
}
Nachdem Sie Ihre test.php -Datei eingefügt haben, geben Sie einfach $output
zurück oder führen etwas wie return test();
aus.