Combinare shortcode e get_template_part
Gestisco un sito WordPress e ho creato una parte di template che solitamente inserisco sotto il contenuto.
<div class="posts-group">
<h2>Prodotti in evidenza del negozio</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>
Ora sto cercando di inserire questo NEL MEZZO del contenuto, quindi ho pensato di utilizzare uno shortcode
function get_products($atts) {
get_template_part('block-products-inline');
}
add_shortcode('products', 'get_products');
Ora ogni volta che inserisco [products], mi aspetto che i prodotti appaiano in quel punto. Tuttavia quando provo il codice sopra, la template_part dei prodotti va tutta in cima alla pagina, subito sotto il titolo e prima del contenuto effettivo.
Ma quando modifico lo shortcode per restituire semplicemente del testo, allora il testo APPARE correttamente nel mezzo del contenuto.
Qualcuno capisce cosa sta succedendo? Perché io non riesco a capirlo...

Prova questo
function get_products($atts) {
ob_start();
get_template_part('block-products-inline');
return ob_get_clean();
}
add_shortcode('products', 'get_products');
Piccola spiegazione
PHP stampa subito il contenuto non appena incontra un'istruzione di stampa. Quello che facciamo qui è trattenere tutto l'output in un buffer e non inviarlo in stampa finché l'intero processo non è completato.
Poi restituiamo il risultato finale completo (output). Questo ci dà il controllo su quando e dove stampare gli output.
Puoi anche assegnarlo a una variabile
e restituirla quando necessario
ob_start();
get_template_part('block-products-inline');
$output = ob_get_clean();
//ora puoi restituire l'output quando vuoi con $output
