Combinarea shortcode cu get_template_part
Administrez un site WordPress și am creat o parte de șablon (template part) pe care de obicei o inserez sub conținut.
<div class="posts-group">
<h2>Produse recomandate din magazin</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>
Acum încerc să pun acest cod ÎN INTERIORUL conținutului, așa că m-am gândit să folosesc un shortcode
function get_products($atts) {
get_template_part('block-products-inline');
}
add_shortcode('products', 'get_products');
Acum, de fiecare dată când postez [products], mă aștept ca produsele să apară acolo. Cu toate acestea, când încerc codul de mai sus, partea de șablon pentru produse apare în partea de sus a paginii, chiar sub titlu și înainte de conținutul propriu-zis.
Dar când modific shortcode-ul pentru a returna doar un text simplu, atunci textul APARE în mijlocul conținutului.
Înțelege cineva ce se întâmplă? Pentru că eu nu înțeleg..

Încearcă asta
function get_products($atts) {
ob_start();
get_template_part('block-products-inline');
return ob_get_clean();
}
add_shortcode('products', 'get_products');
Mică explicație
PHP afișează conținutul imediat ce întâlnește o declarație de tip print. Ceea ce facem aici este să păstrăm toate rezultatele într-un buffer și să nu le afișăm până când tot procesul se termină.
Apoi returnăm întregul rezultat final (output-ul). Asta ne oferă control asupra momentului și locului unde să afișăm rezultatele.
Poți chiar să le atribui unei variabile
și să le returnezi când ai nevoie
ob_start();
get_template_part('block-products-inline');
$output = ob_get_clean();
// acum poți returna output-ul oricând dorești folosind $output
