Combinando shortcode e get_template_part

3

Eu gerencio um site wordpress e criei uma parte de modelo que normalmente colo abaixo do conteúdo.

    <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);?>">
            <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>

Agora estou tentando colocar isso ENTRE o conteúdo, então pensei em usar um shortcode

function get_products($atts) {
get_template_part('block-products-inline');
}
add_shortcode('products', 'get_products');

Agora, toda vez que postar [produtos], espero que os produtos sejam levados até lá. No entanto, quando tento o código acima, os produtos template_part percorrem todo o caminho até o topo da página, logo abaixo do título e logo antes do conteúdo real.

Mas quando edito o shortcode para simplesmente retornar algum texto, o texto aparece no meio do conteúdo.

Alguém entende o que está acontecendo? Porque eu não faço ..

    
por vlovsky 05.01.2016 / 14:05

1 resposta

11

Tente isso

function get_products($atts) {
  ob_start();
  get_template_part('block-products-inline');
  return ob_get_clean();
}
add_shortcode('products', 'get_products');

Pequena explicação

O php apenas exibe o seu conteúdo imediatamente quando é exibido o comando print. O que fazemos aqui é que guardamos toda a saída em buffer e não a imprimimos até que tudo termine.

então estamos retornando os resultados finais completos (saídas). Isso dá o controle do nosso lado para quando e onde imprimir as saídas.

Você pode até atribuí-lo em variable e devolvê-lo quando necessário

  ob_start();
  get_template_part('block-products-inline');
  $output =  ob_get_clean();
  //now you can return the output whenever you want with $output
    
por WPTC-Troop 05.01.2016 / 14:10