it-swarm.com.ru

Включают PHP файл в контенте с помощью [шорткода]

Вот что у меня

Мне не повезло найти, как просто включить файл в редактор контента с помощью шорткода.

Например, если бы я хотел включить form.php в мою страницу контактов, как бы я сделал это, используя шорткод?

Ниже пытался работать безрезультатно.

Любая помощь будет оценена!

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

Я изменил некоторый код из старого поста в блоге, чтобы сделать это, и разрешил присоединять строки запроса к файлу.

Оригинальный кредит идет на amberpanther.com , и оказывается, что они сделали плагин из этого тоже.

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

Я установил мой для извлечения из таблицы стилей uri (чтобы он работал с дочерними темами и т.д.), Но вы можете легко настроить этот код, чтобы извлекать его из любого места (включая каталоги плагинов), или вообще удалить его и просто использовать полный путь при включении файла. Вы могли бы даже добавить условное обозначение с символом триггера в начале, которое говорит ему использовать конкретный путь, основанный на том, что является первым символом имени файла, например, использовать "#" для каталога шаблонов и т.д.

Я использую его для извлечения файла с именем get-posts.php, который находится в моем каталоге шаблонов и форматирует вывод различных сообщений на основе ряда параметров, предоставленных в строке запроса. Это избавляет меня от необходимости специальных шаблонов, потому что я могу включить файл, отправить его в формате, и он будет выводить посты с разметкой, указанной в файле get-posts.php.

Это также позволяет клиентам извлекать пользовательские типы сообщений в реальные сообщения в блогах в определенных форматах, и это очень удобно.

Дайте мне знать, если вам нужно что-то прояснить.

2
Eric Allen

Вот еще один способ сделать это, используя get_template_part из 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');

примеры:

[include slug="form"]

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

4
adedoy

Я обнаружил, что код включения, изначально написанный людьми AmberPanther, не работал для меня так хорошо, поэтому я нашел другой плагин для WordPress, который делает то же самое. Стефано Лисса называется "Включи меня". Использование в значительной степени, что вы пишете свой путь к файлу, начиная с корневого каталога вашего сайта.

Например, на своей странице WordPress вы написали бы:

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

и в ваш файл functions.php вы бы включили:

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

конечно, я бы также рекомендовал просто установить плагин, чтобы вы могли воспользоваться обновлениями. https://wordpress.org/plugins/include-me/

0
user18275

Хорошо, сначала я бы прекратил буферизацию вывода.

Второе изменение:

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

К

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

В заключение,

Читая документацию здесь: https://codex.wordpress.org/Shortcode_API

Вам нужно что-то вернуть, если ваш test.php не выводит что-то возвращаемым образом, у вас будет плохое время.

Поэтому убедитесь, что test.php делает что-то вроде:

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

Затем, после того как вы включите test.php file - вы просто возвращаете $output или делаете что-то вроде return test();.

0
Sterling Hamilton