Вызов 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-скрипт для возврата сообщений.
Кто-нибудь делал это раньше?
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;
}
Вот более динамичная версия, в которой вы можете передать путь к шаблону.
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"]
Минимальная версия принятого ответа:
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
- файл, который вы хотите включить.
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' );