I manage a wordpress site and have created a template part that I usually paste below the content.
<div class="posts-group">
<h2>Featured store products</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);?>" rel="nofollow noreferrer noopener">
<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>
Now I’m trying to put this IN BETWEEN the content, so I thought of using a shortcode
function get_products($atts) {
get_template_part('block-products-inline');
}
add_shortcode('products', 'get_products');
Now every time I post [products], I expect the products to go there.
However when I try the code above, the products template_part goes all the way to the top of the page, right underneath the title and right before the actual content.
But when I edit the shortcode to simply return some text, then the text DOES appear in the middle of the content.
Does anyone understand what’s going on? Because I don’t..
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Try this
function get_products($atts) {
ob_start();
get_template_part('block-products-inline');
return ob_get_clean();
}
add_shortcode('products', 'get_products');
Little explanation
php just outputs your content right away when its see print statement. What we do here is, we are holding all the output in buffer and not giving it in print until the whole things finish.
then we are returning the final whole results(outputs). This gives control on our side to when and where to print outputs.
You can even assign it to in variable and return them when needed
ob_start();
get_template_part('block-products-inline');
$output = ob_get_clean();
//now you can return the output whenever you want with $output
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0