wake-up-neo.net

Umfassen PHP Datei im Inhalt mit [Shortcode]

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');
4
Eric Downs

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.

2
Eric Allen

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"]

4
adedoy

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');
1
CharlesM

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('&amp;', '&', $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/

0
user18275

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.

0