web-dev-qa-db-fra.com

Comprendre PHP fichier dans le contenu en utilisant [shortcode]

Voici ce que j'ai

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

Par exemple, si je voulais inclure form.php dans ma page de contact, comment pourrais-je y arriver en utilisant un shortcode?

Ci-dessous est en train d'essayer de travailler avec en vain.

Toute aide serait appréciée!

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

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

Le crédit original va à amberpanther.com , et il s'avère qu'ils ont fabriqué un plug-in en dehors 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 (donc cela fonctionnera avec des thèmes enfants), mais vous pourrez ajuster ce code pour extraire celui-ci de n'importe où (y compris les répertoires de plug-ins), ou le supprimer complètement et simplement utiliser le chemin complet. en incluant le 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, par exemple en utilisant 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 générer les publications avec le balisage que j'ai spécifié dans le fichier get-posts.php.

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

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

2
Eric Allen

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

4
adedoy

J'ai trouvé 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. Il s'appelle Include Me, de Stefano Lissa. L’utilisation est à peu près que vous écrivez votre chemin dans le fichier, à partir du répertoire racine de votre site.

Ainsi, 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 recommande également d'installer le plug-in afin que vous puissiez profiter des mises à jour. https://wordpress.org/plugins/include-me/

0
user18275

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

Deuxième changement:

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

À

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

Finalement,

Lire la documentation ici: https://codex.wordpress.org/Shortcode_API

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 fait quelque chose dans le sens de:

$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 test.php fichier - vous renvoyez simplement $output ou faites quelque chose comme return test();.

0
Sterling Hamilton