Combinando shortcode y get_template_part
Administro un sitio WordPress y he creado una parte de plantilla que normalmente pego debajo del contenido.
<div class="posts-group">
<h2>Productos destacados de la tienda</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>
Ahora estoy tratando de colocar esto EN MEDIO del contenido, así que pensé en usar un shortcode
function get_products($atts) {
get_template_part('block-products-inline');
}
add_shortcode('products', 'get_products');
Ahora cada vez que publico [products], espero que los productos aparezcan allí. Sin embargo, cuando pruebo el código anterior, la parte de la plantilla de productos va hasta la parte superior de la página, justo debajo del título y antes del contenido actual.
Pero cuando edito el shortcode para simplemente devolver algún texto, entonces el texto SÍ aparece en medio del contenido.
¿Alguien entiende qué está pasando? Porque yo no...

Prueba esto
function get_products($atts) {
ob_start();
get_template_part('block-products-inline');
return ob_get_clean();
}
add_shortcode('products', 'get_products');
Pequeña explicación
PHP simplemente imprime el contenido de inmediato cuando ve una declaración de impresión. Lo que hacemos aquí es almacenar toda la salida en un búfer y no imprimirla hasta que todo termine.
Luego devolvemos el resultado final completo (salidas). Esto nos da control sobre cuándo y dónde imprimir las salidas.
Incluso puedes asignarlo a una variable
y devolverlo cuando sea necesario
ob_start();
get_template_part('block-products-inline');
$output = ob_get_clean();
//ahora puedes devolver la salida cuando quieras con $output
