Inclure un fichier PHP dans le contenu à l'aide de [shortcode]

4

Voici ce que j'ai

Je ne cherche pas à savoir comment inclure simplement un fichier dans l'éditeur de contenu à l'aide d'un shortcode.

Par exemple, si je souhaitais inclure form.php dans ma page de contact, comment y arriverais-je à l'aide d'un shortcode?

Ci-dessous tente de travailler en vain.

Toute aide serait la bienvenue!

// 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');
    
posée Eric Downs 20.04.2012 - 17:29

4 réponses

2

Pour ce faire, j'ai modifié du code d'un ancien article de blog et je peux également associer des chaînes de requête au fichier.

Le crédit initial va à amberpanther.com , et il s'avère qu'ils ont créé un plug-in hors de cela aussi.

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

Je mets le mien à extraire de la feuille de style uri (afin que cela fonctionne avec des thèmes enfants), mais vous pouvez facilement ajuster ce code pour extraire celui-ci de n'importe où (y compris les répertoires de plug-ins), ou simplement le supprimer. le chemin complet lors de l'inclusion du fichier. Vous pouvez même ajouter une condition avec un caractère de déclenchement au début qui lui indique d’utiliser un chemin spécifique en fonction du nom du premier caractère du nom du fichier, comme utiliser un "#" pour le répertoire du modèle, etc.

Je l'utilise pour extraire un fichier appelé get-posts.php qui réside dans mon répertoire de modèles et formate la sortie de divers articles en fonction d'une série de paramètres fournis dans la chaîne de requête. Cela me évite d’avoir besoin de modèles spéciaux car je peux inclure le fichier, lui envoyer un format et afficher les articles avec le balisage que j'ai spécifié dans le fichier get-posts.php.

Il permet également aux clients d'extraire des types d'articles personnalisés dans des articles de blog dans des formats spécifiques, ce qui est très pratique.

Faites-moi savoir si vous avez besoin d'éclaircissements.

    
réponse donnée Eric Allen 20.04.2012 - 23:51
3

Voici une autre façon de le faire, en utilisant get_template_part de wordpress

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

exemples:

[include slug="form"]

[include slug="sub-folder/filename_without_extension"]

    
réponse donnée adedoy 21.01.2016 - 00:29
0

J'ai constaté que le code d'inclusion écrit à l'origine par les gens d'AmberPanther ne fonctionnait pas très bien pour moi, alors j'ai trouvé un autre plugin wordpress qui fait à peu près la même chose. Cela s'appelle Include Me, de Stefano Lissa. En général, vous écrivez votre chemin dans le fichier, à partir du répertoire racine de votre site.

Par exemple, dans votre page WordPress, vous écrivez:

[includeme file="wp-content/themes/your-theme/code/example-code.php"]

et dans votre fichier functions.php, vous incluez:

<?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');
}

bien sûr, je vous recommanderais également d'installer le plug-in afin que vous puissiez tirer parti des mises à jour. enlace

    
réponse donnée user18275 07.11.2014 - 02:08
0

Ok, je voudrais d'abord abandonner la mise en mémoire tampon de la sortie.

Deuxième changement:

include(TEMPLATEPATH.'/wp-content/themes/grainandmortar/inc_static/test.php');

Pour

include( get_stylesheet_directory() . '/inc_static/test.php');

Enfin,

Lisez la documentation ici: enlace

Vous devez retourner quelque chose. Si votre test.php ne génère pas quelque chose de manière consigné, vous passerez un mauvais moment.

Assurez-vous donc que test.php effectue les tâches suivantes:

$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.
}

Ensuite, après avoir inclus votre fichier test.php , vous renvoyez simplement $output ou effectuez une opération telle que return test(); .

    
réponse donnée Sterling Hamilton 21.01.2016 - 00:43

Lire d'autres questions sur les étiquettes