Совмещение шорткода и get_template_part
Я управляю сайтом на 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], я ожидаю, что продукты появятся там. Однако когда я пробую код выше, часть шаблона с продуктами перемещается в самый верх страницы, прямо под заголовком и перед фактическим контентом.
Но когда я изменяю шорткод, чтобы он просто возвращал текст, тогда текст ДЕЙСТВИТЕЛЬНО появляется в середине контента.
Кто-нибудь понимает, что происходит? Потому что я не понимаю..

Попробуйте этот код
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
