Как я могу отобразить содержимое части шаблона внутри другой страницы?

Вопрос или проблема

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() для настройки текущего поста.

Вот пошаговое решение для создания шорткода, который будет выводить комментарии определенного поста на отдельной странице:

  1. Создание функции шорткода:
    Сначала мы создадим шорткод, который принимает 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' );
  1. Использование шорткода:
    Теперь вы можете использовать шорткод [comments id="20"] на любой странице или записи, чтобы отобразить комментарии поста с ID 20.

  2. Учёт особенностей:

    • Имейте в виду, что при использовании ob_start() и ob_get_clean(), необходимо избегать прямого вывода контента (например, через echo) в вашей шаблонной части; вместо этого контент должен быть возвращен, чтобы корректно отобразиться на странице, где используется шорткод.
    • Убедитесь, что путь к шаблонной части корректен, и что у вас есть соответствующие условия, обрабатывающие вывод комментариев.
  3. Примечания:
    • Использование функции locate_template() для подключения шаблонной части может быть полезным для выбора темы.
    • Убедитесь, что вы протестировали код на локальном или тестовом сервере перед публикацией.

Данное решение позволяет вам гибко использовать существующие шаблонные части в других контекстах, без необходимости дублирования кода и с легкостью управлять выводом контента на страницах вашего сайта.

Оцените материал
Добавить комментарий

Капча загружается...