Combinare shortcode e get_template_part

5 gen 2016, 15:05:35
Visualizzazioni: 23.2K
Voti: 7

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...

0
Tutte le risposte alla domanda 1
2
29

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
5 gen 2016 15:10:45
Commenti

Fantastico, funziona! Non conoscevo le cose relative a ob, ora mi documento!

vlovsky vlovsky
5 gen 2016 15:18:17

Ho aggiunto una piccola spiegazione. Controlla :)

WPTC-Troop WPTC-Troop
5 gen 2016 15:30:53