Вопрос или проблема
WordPress, конечно, состоит из шаблонов и частей шаблонов, из которых состоят эти шаблоны. Я знаю, что могу переопределить части шаблонов – но я не об этом здесь. Я пытаюсь взять HTML, сгенерированный указанной частью шаблона, и отобразить его в другом месте.
Как я могу получить отрендеренные данные HTML из части шаблона для данного ID страницы/поста и отобразить их как часть другой страницы, предпочтительно в виде шорткода? Вот пример.
Допустим, что пост с ID = 20 имеет комментарии, которые я хотел бы отобразить на отдельной странице. Я хочу написать шорткод, который делает это:
— найти данные комментариев для поста с ID = 20
— применить этот ID к части шаблона .//templates/comments.php и сохранить отрендеренный HTML в шорткоде
— использовать мой пользовательский шорткод в любом месте на странице для его отображения. В конечном итоге я бы показал комментарии с аналогичным [comments id=”20″]
Я знаю, что здесь использую “comments”, но это всего лишь пример. Это будет применимо и в других местах, особенно с WooCommerce, например, когда я хочу показать конкретный атрибут продукта для данного продукта.
Используйте setup_postdata()
, чтобы сделать ‘текущий пост’ любым данным поста, а затем извлеките часть шаблона, прежде чем сбросить данные поста обратно к исходному посту. Любые теги шаблона, которые зависят от текущего поста в цикле, находящиеся в части шаблона, будут ссылаться на пост, который вы установили с помощью этой функции.
function wpse_302305_shortcode( $atts ) {
global $post;
$atts = shortcode_atts( ['id' => 0], $atts );
$post = get_post( $atts['id'] );
ob_start();
if ( $post ) {
setup_postdata( $post );
get_template_part( 'path/to/template' );
wp_reset_postdata();
}
return ob_get_clean();
}
add_shortcode( 'template', 'wpse_302305_shortcode' );
Когда я пытаюсь сделать что-то подобное, я использую ob_start()
и ob_get_clean()
, чтобы преобразовать результирующую часть шаблона в строку, которая может быть возвращена для шорткода.
Общая проблема с шорткодами заключается в том, что если вы ЭХО выход, он будет выводить контент не в то время.
Далее вам нужно будет использовать include locate_template('template-name.php')
, чтобы ваши переменные передавались в правильной области видимости.
Если вы пытаетесь загрузить часть шаблона напрямую, вы можете сделать что-то вроде этого (этот код не тестировался):
// [get_comment id=0]
function get_comment_shortcode($atts){
$a = shortcode_atts([
'id' => 0,
], $atts);
if(!get_comment($a['id'])) return false; //Выход при отсутствии комментария
$id = $a['id']; //ссылайтесь на этот ID в вашем шаблоне, чтобы получить ID комментария
ob_start();
include locate_template('comment-template.php');
$result = ob_get_clean();
return $result;
}
add_shortcode('get_comment', 'get_comment_shortcode');
Ссылки:
https://codex.wordpress.org/Function_Reference/locate_template
https://codex.wordpress.org/Shortcode_API
Ответ или решение
В WordPress вы можете использовать шаблонные части и выводить их на других страницах с помощью шорткодов. Для решения вашей задачи, заключающейся в том, чтобы получить сгенерированный HTML-код из шаблонной части и отображать его на другой странице, мы можем воспользоваться функциями ob_start()
и ob_get_clean()
, а также использовать функцию setup_postdata()
для настройки текущего поста.
Вот пошаговое решение для создания шорткода, который будет выводить комментарии определенного поста на отдельной странице:
- Создание функции шорткода:
Сначала мы создадим шорткод, который принимает ID поста и выводит содержимое его комментариев, используя указанную шаблонную часть (comments.php
в вашем случае).
function wpse_display_comments_shortcode( $atts ) {
global $post;
// Извлекаем атрибуты шорткода и устанавливаем значение по умолчанию
$atts = shortcode_atts( ['id' => 0], $atts );
// Получаем пост по ID
$post = get_post( intval($atts['id']) );
// Начинаем буферизацию вывода
ob_start();
if ( $post ) {
// Настраиваем глобальную переменную поста
setup_postdata( $post );
// Подключаем шаблонную часть
get_template_part( 'templates/comments' );
// Сбрасываем данные поста
wp_reset_postdata();
}
// Получаем содержимое буфера и очищаем его
return ob_get_clean();
}
// Регистрируем шорткод
add_shortcode( 'comments', 'wpse_display_comments_shortcode' );
-
Использование шорткода:
Теперь вы можете использовать шорткод[comments id="20"]
на любой странице или записи, чтобы отобразить комментарии поста с ID 20. -
Учёт особенностей:
- Имейте в виду, что при использовании
ob_start()
иob_get_clean()
, необходимо избегать прямого вывода контента (например, черезecho
) в вашей шаблонной части; вместо этого контент должен быть возвращен, чтобы корректно отобразиться на странице, где используется шорткод. - Убедитесь, что путь к шаблонной части корректен, и что у вас есть соответствующие условия, обрабатывающие вывод комментариев.
- Имейте в виду, что при использовании
- Примечания:
- Использование функции
locate_template()
для подключения шаблонной части может быть полезным для выбора темы. - Убедитесь, что вы протестировали код на локальном или тестовом сервере перед публикацией.
- Использование функции
Данное решение позволяет вам гибко использовать существующие шаблонные части в других контекстах, без необходимости дублирования кода и с легкостью управлять выводом контента на страницах вашего сайта.