Совмещение шорткода и get_template_part

5 янв. 2016 г., 15:05:35
Просмотры: 23.2K
Голосов: 7

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

    <div class="posts-group">

        <h2>Рекомендуемые товары магазина</h2>

        <?php $catquery = new WP_Query( 'post_type=product&posts_per_page=4&orderby=rand' );
        while($catquery->have_posts()) : $catquery->the_post();
        ?>
        <a href="<?php echo get_post_meta($post->ID,'PRODUCT-url', true);?>">
            <article class="post home-post homeproduct">
                    <div class="post-thumbnail-img">
                        <?php the_post_thumbnail('small-thumbnail'); ?>
                    </div>
                    <h2><?php the_title(); ?></h2>              
                    <p></p>
            </article>
        </a>

        <?php endwhile; ?>

</div>

Теперь я пытаюсь разместить это МЕЖДУ контентом, поэтому я подумал об использовании шорткода

function get_products($atts) {
get_template_part('block-products-inline');
}
add_shortcode('products', 'get_products');

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

Но когда я изменяю шорткод, чтобы он просто возвращал текст, тогда текст ДЕЙСТВИТЕЛЬНО появляется в середине контента.

Кто-нибудь понимает, что происходит? Потому что я не понимаю..

0
Все ответы на вопрос 1
2
29

Попробуйте этот код

function get_products($atts) {
  ob_start();
  get_template_part('block-products-inline');
  return ob_get_clean();
}
add_shortcode('products', 'get_products');

Небольшое пояснение

PHP выводит содержимое сразу же, как встречает команду вывода. Что мы делаем здесь - мы сохраняем весь вывод в буфере и не отдаем его до тех пор, пока все не завершится.

Затем мы возвращаем окончательный результат (вывод). Это дает нам контроль над тем, когда и где выводить результаты.

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

  ob_start();
  get_template_part('block-products-inline');
  $output =  ob_get_clean();
  // теперь вы можете вернуть вывод в любой момент с помощью $output
5 янв. 2016 г. 15:10:45
Комментарии

Отлично, это работает! Не знал про ob-функции, сейчас изучаю их!

vlovsky vlovsky
5 янв. 2016 г. 15:18:17

Добавил небольшое пояснение. Проверь :)

WPTC-Troop WPTC-Troop
5 янв. 2016 г. 15:30:53