Вызов WordPress получить часть шаблона изнутри функции шорткода сначала отображает шаблон


У меня есть страница, на которой мне нужно разрешить пользователю вводить абзац текста. Затем после этого текста вставьте шорткод, который отобразит список сообщений, а затем добавьте еще текст в свободной форме после этого. Я думал, что они должны иметь возможность вставлять шорткод, который будет выводить сообщения. Таким образом, они могут просто добавить шорткод там, где они хотят, чтобы появлялись сообщения.

В настоящее время у меня есть логика, которая извлекает сообщения, разделенные в отдельном файле. В настоящее время я включаю его в страницу, просто используя функцию get_template_part():

get_template_part('donation', 'posts');

Я изучил, как создать шорткод, и включил следующий код в свой файл functions.php, чтобы создать шорткод:

add_shortcode('donation-posts', 'fnDonatePosts');   
function fnDonatePosts($attr, $content)
{
    get_template_part('donation', 'posts');    
}

donation-posts.php выполняется должным образом, и сообщения появляются, однако они всегда располагаются ПЕРЕД контентом, а не в том месте, где был размещен шорткод.

Я попытался удалить функцию get_template_part() и просто вывести текст, и это отлично работает. Так что я поймите, что get_template_part() может быть неправильным способом сделать это, однако я не смог найти способ сделать то, что я пытаюсь сделать (я уверен, что есть способ... Я просто не нашел его).

Я пробовал:

include(get_template_directory(). '/donation-posts.php');
include_once(get_template_directory(). '/donation-posts.php') : 

Но они перестали обрабатываться, как только попали в PHP-код во включенном файле.

Я также пробовал:

$file = file_get_contents(get_template_directory(). '/donation-posts.php');  
        return $file;

Но это возвращает только содержимое файла (как указано в имени функции), что означает, что он не выполните PHP-скрипт для возврата сообщений.

Кто-нибудь делал это раньше?

Author: Kirk Beard, 2012-09-08

4 answers

Вы можете попробовать это, это может решить вашу проблему, потому что get_template_part в основном реагирует так PHP's require, он не возвращается, но немедленно воспроизводит содержимое там, где оно было вызвано.

add_shortcode('donation-posts', 'fnDonatePosts');   
function fnDonatePosts($attr, $content)
{        
    ob_start();  
    get_template_part('donation', 'posts');  
    $ret = ob_get_contents();  
    ob_end_clean();  
    return $ret;    
}
 18
Author: The Alpha, 2012-09-07 21:30:39

Вот более динамичная версия, в которой вы можете передать путь к шаблону.

function template_part( $atts, $content = null ){
   $tp_atts = shortcode_atts(array( 
      'path' =>  null,
   ), $atts);         
   ob_start();  
   get_template_part($tp_atts['path']);  
   $ret = ob_get_contents();  
   ob_end_clean();  
   return $ret;    
}
add_shortcode('template_part', 'template_part');  

И короткий код:

[template_part path="includes/social-sharing"]
 7
Author: Darren Cooney, 2015-02-12 12:44:50

Минимальная версия принятого ответа:

function my_template_part_shortcode() {
    ob_start();
    get_template_part( 'my_template' );
    return ob_get_clean();
}
add_shortcode( 'my_template_part', 'my_template_part_shortcode' );

Где my-template.php - файл, который вы хотите включить.

 1
Author: apostl3pol, 2015-11-01 22:54:48

Get_template_part() не работал для меня при использовании его в functions.php . Вместо этого я использовал locate_template() внутри ob_start и очистил. Например:

function full_petition_shortcode( $attr ) {
    ob_start();
    locate_template( 'petition.php', TRUE, TRUE );

    return ob_get_clean();
}
add_shortcode( 'full-petition', 'full_petition_shortcode' );
 1
Author: Alex Fuentes, 2015-11-28 16:19:17