Combinando shortcode y get_template_part

5 ene 2016, 15:05:35
Vistas: 23.2K
Votos: 7

Administro un sitio WordPress y he creado una parte de plantilla que normalmente pego debajo del contenido.

    <div class="posts-group">

        <h2>Productos destacados de la tienda</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>

Ahora estoy tratando de colocar esto EN MEDIO del contenido, así que pensé en usar un shortcode

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

Ahora cada vez que publico [products], espero que los productos aparezcan allí. Sin embargo, cuando pruebo el código anterior, la parte de la plantilla de productos va hasta la parte superior de la página, justo debajo del título y antes del contenido actual.

Pero cuando edito el shortcode para simplemente devolver algún texto, entonces el texto SÍ aparece en medio del contenido.

¿Alguien entiende qué está pasando? Porque yo no...

0
Todas las respuestas a la pregunta 1
2
29

Prueba esto

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

Pequeña explicación

PHP simplemente imprime el contenido de inmediato cuando ve una declaración de impresión. Lo que hacemos aquí es almacenar toda la salida en un búfer y no imprimirla hasta que todo termine.

Luego devolvemos el resultado final completo (salidas). Esto nos da control sobre cuándo y dónde imprimir las salidas.

Incluso puedes asignarlo a una variable y devolverlo cuando sea necesario

  ob_start();
  get_template_part('block-products-inline');
  $output =  ob_get_clean();
  //ahora puedes devolver la salida cuando quieras con $output
5 ene 2016 15:10:45
Comentarios

¡Increíble, esto funciona! No sabía sobre lo de ob, ¡voy a leer al respecto ahora mismo!

vlovsky vlovsky
5 ene 2016 15:18:17

Añadí una pequeña explicación. Échale un vistazo :)

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