Combinarea shortcode cu get_template_part

5 ian. 2016, 15:05:35
Vizualizări: 23.2K
Voturi: 7

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

0
Toate răspunsurile la întrebare 1
2
29

Î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
5 ian. 2016 15:10:45
Comentarii

Super, funcționează! Nu știam despre funcțiile ob, acum mă documentez!

vlovsky vlovsky
5 ian. 2016 15:18:17

Am adăugat o mică explicație. Verifică :)

WPTC-Troop WPTC-Troop
5 ian. 2016 15:30:53