Inclua o arquivo PHP no conteúdo usando [shortcode]

4

Aqui está o que eu tenho

Eu não estou tendo nenhuma conclusão interessante de como simplesmente incluir um arquivo no editor de conteúdo usando um shortcode.

Por exemplo, se eu quisesse incluir form.php dentro da minha página de contato, como eu faria isso acontecer usando um shortcode?

Abaixo está tentando trabalhar sem sucesso.

Qualquer ajuda seria apreciada!

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

4 respostas

2

Eu modifiquei alguns códigos de um post antigo para fazer isso e permiti que strings de consulta também fossem anexadas ao arquivo.

O crédito original vai para amberpanther.com , e acontece que eles fizeram um plug-in fora disso também.

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

Eu configurei o meu para extrair da folha de estilo uri (para que funcionasse com temas filho e tal), mas você poderia ajustar esse código facilmente para puxar de qualquer lugar (incluindo diretórios de plug-in) ou removê-lo completamente e apenas usar o caminho completo ao incluir o arquivo. Você poderia até mesmo adicionar um condicional com um caractere de gatilho no começo que diz para ele usar um caminho específico baseado no que o primeiro caractere do nome do arquivo é, como usar um "#" para o diretório de templates, etc.

Eu o uso para puxar um arquivo chamado get-posts.php que reside no meu diretório de modelos e formata a saída de vários posts com base em uma série de parâmetros fornecidos na string de consulta. Isso evita que eu precise de modelos especiais, porque posso incluir o arquivo, enviá-lo em um formato e enviar os posts com a marcação especificada no arquivo get-posts.php.

Ele também permite que os clientes coloquem tipos de postagem personalizados em posts reais em formatos específicos e é bastante útil.

Deixe-me saber se você precisa de esclarecimentos sobre qualquer coisa.

    
por Eric Allen 20.04.2012 / 23:51
3

Aqui está outra maneira de fazer isso, utilizando get_template_part do 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');

exemplos:

[include slug="form"]

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

    
por adedoy 21.01.2016 / 00:29
0

Descobri que o código de inclusão originalmente escrito pelo pessoal do AmberPanther não funcionou tão bem para mim, então eu encontrei outro plugin do wordpress que faz basicamente a mesma coisa. Chama-se Incluir-Me, de Stefano Lissa. O uso é praticamente que você escreve seu caminho para o arquivo, começando pelo diretório raiz do seu site.

Por exemplo, na sua página do WordPress você escreveria:

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

e dentro do seu arquivo functions.php você incluiria:

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

é claro, eu também recomendo apenas instalar o plugin para que você possa aproveitar as atualizações. enlace

    
por user18275 07.11.2014 / 02:08
0

Ok, primeiro eu descartaria o buffer de saída.

Segunda alteração:

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

Para

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

Finalmente,

Lendo a documentação aqui: enlace

Você precisa retornar algo, se o seu test.php não resultar em algo retornável, você terá um mau momento.

Portanto, certifique-se de que test.php faça algo nos seguintes termos:

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

Depois de incluir seu arquivo test.php , basta retornar $output ou fazer algo como return test(); .

    
por Sterling Hamilton 21.01.2016 / 00:43