Código corto para mostrar un bucle

25 nov 2011, 07:06:22
Vistas: 18.7K
Votos: 3

He estado trabajando en este shortcode sin éxito...

function loop_shortcode( $atts = '' ) {

'<div class="clear"></div>
<div class="childs grid_12"> 
 <?php
 $the_query = new  WP_Query( 
     array(
         "post_parent" => "8",
         "post_type" => "page",
         "posts_per_page" => 4,
         "sort_column"   => "menu_order"
     )
 ); ?>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
   <div id="service-hp">
       <?php the_post_thumbnail("home-thumb") ?>
       <h2 style="margin-bottom:5px"><?php the_title() ?></h2>
       <?php the_excerpt() ?>
       <a class="read-more" href="<?php the_permalink() ?>">ver más <img src="<?php bloginfo( "template_url" ); ?>/images/read-more.png" alt="Leer más" title="Leer más"></a>
   </div> <!-- termina aquí -->
<?php endwhile; ?>
<?php wp_reset_query() ?>
</div>';
 }

 function my_loop_shortcode( $atts ) {
     ob_start(); 
     loop_shortcode($atts);
     return ob_get_clean(); 
 }         

 add_shortcode('my_loop', 'my_loop_shortcode');      

No obtengo ningún resultado

Agradecería su ayuda

Gracias de antemano

ACTUALIZACIÓN Descripción de la imagen

3
Comentarios

Tu función no parece hacer echo ni devolver nada. Además, intenta usar get_posts en lugar de un nuevo WP_Query.

Rutwick Gangurde Rutwick Gangurde
25 nov 2011 07:17:20

No entiendo por qué votar negativo mi pregunta... en fin, siempre hay alguien así por ahí...

andresmijares andresmijares
25 nov 2011 20:18:02

¡No fui yo quien votó negativo, hombre! Quizá alguien que no lo entendió.

Rutwick Gangurde Rutwick Gangurde
26 nov 2011 05:50:15
Todas las respuestas a la pregunta 2
4

Hay múltiples problemas en lo anterior. Primero, post_parent en los argumentos de la consulta debe ser un entero. Estás asignándole una cadena. Varias de tus llamadas a funciones de WordPress, como the_excerpt() y wp_reset_query(), carecen de punto y coma al final. $atts es un array asociativo de atributos para el shortcode. Si deseas usar atributos, deben extraerse en la función del shortcode. No hay necesidad de pasarlos a la función de bucle, especialmente considerando que no los has extraído previamente. Además, ni siquiera estás intentando usarlos en ella.

Además, no veo por qué querrías separarlo en dos funciones. Tampoco incluiría marcado directo en funciones y usaría ob_get_clean, sino que echo o return el resultado deseado directamente. Estos últimos son más o menos preferencias personales.

Dicho esto, esto hará lo que deseas:

function andrew_loop_shortcode( $atts ) {
    extract( shortcode_atts( array(
        'parent' => 8,
        'type' => 'page',
        'perpage' => 4
    ), $atts ) );
    $output = '<div class="clear"></div><div class="childs grid_12">';
    $args = array(
        'post_parent' => $parent,
        'post_type' => $type,
        'posts_per_page' => $perpage,
        'sort_column'   => 'menu_order'
    );
    $andrew_query = new  WP_Query( $args );
    while ( $andrew_query->have_posts() ) : $andrew_query->the_post();
        $output .= '<div id="service-hp">'.
                   get_the_post_thumbnail('home-thumb').
                   '<h2 style="margin-bottom:5px">'.
                   get_the_title().
                   '</h2>'.
                   get_the_excerpt().
                   '<a class="read-more" href="'.
                   get_permalink().
                   '">en savoir plus <img src="'.
                   get_bloginfo( 'template_url' ).
                   '/images/read-more.png"></a></div><!--  ends here -->';
    endwhile;
    wp_reset_query();
    $output .= '</div>';
    return $output;
}
add_shortcode('andrewloop', 'andrew_loop_shortcode');

Las líneas 2 a 6 del código anterior no son estrictamente necesarias, pero añaden funcionalidad a tu shortcode.

Si ahora simplemente usas [andrewloop] en una página, mostrará lo que buscas actualmente. Para lograr solo eso, podrías establecer los argumentos de la consulta de forma estática en la función del shortcode. Sin embargo, con las líneas 2-6, esos son ahora los valores predeterminados del shortcode, pero se pueden cambiar sobre la marcha sin modificar nuevamente la función.

Con lo anterior, ahora puedes usar [andrewloop parent="6" perpage="3"], por ejemplo. El shortcode puede usarse así para múltiples consultas diferentes.

Lectura adicional, por si te interesa:

25 nov 2011 08:38:22
Comentarios

Hola Johannes, básicamente estaba usando una guía para un tutorial, sin embargo parece que no es muy efectiva, gracias por tu respuesta, lo intenté y funcionó más o menos pero me está dando algunos errores que no entiendo por qué, por ejemplo, se rompe porque dice que get_the_permalink() no está definida y también me está dando un echo del enlace que es raro, y no está tomando las etiquetas H2 en absoluto, ¿qué crees que podría estar causando los errores?

andresmijares andresmijares
25 nov 2011 20:35:03

Me di cuenta de que hay un error en la función, es get_permalink, eso está solucionado, sin embargo el gran problema ahora es mostrar los resultados como... primero las funciones y luego todas las clases, pondré una imagen en la pregunta para que lo veas

andresmijares andresmijares
25 nov 2011 20:40:44

@andrewkthx Lo escribí rápidamente sin revisar, lo siento. Edité la respuesta para que sea correcta como referencia futura (get_permalink). No entiendo exactamente cuál es tu problema ahora - si no estás satisfecho con el markup, simplemente edita el loop. En cuanto a cómo se ve - eso es un asunto de estilo (es decir, css) y debe tratarse en tus hojas de estilo.

Johannes Pille Johannes Pille
25 nov 2011 21:16:16

Gracias de nuevo Johannes, lo que quise decir es que hay algo raro porque por ejemplo, el código dice '<h2 style="margin-bottom:5px">'. get_the_title() . '</h2>'. Sin embargo, fíjate que la salida en el código fuente que subí, está generando primero el título con la salida de la otra función y luego, después de todo, muestra los divs y etiquetas, el resto funciona genial sin duda

andresmijares andresmijares
25 nov 2011 21:43:36
0

No soy muy bueno con los shortcodes porque casi no los uso, pero aquí está mi contribución.

function loop_shortcode($atts, $content = null) {

    shortcode_atts(array(
        'post_parent' => 8,
            'post_type' => 'page',
            'posts_per_page' => 4,
            'sort_column' => 'menu_order'
    ), $atts);

    $the_query = new WP_Query();
    $the_query->query($atts);

    if ($the_query->have_posts()) : while ($the_query->have_posts()) :  
             $the_query->the_post(); ob_start(); ?>

    <div id="service-hp">
              <?php the_post_thumbnail('home-thumb') ?>
                     <h2 style="margin-bottom:5px"><?php the_title() ?></h2>
                                    <?php the_excerpt() ?>
       <a class="read-more" href="<?php the_permalink() ?>">en savoir plus <img src="<?php bloginfo( "template_url" ); ?>/images/read-more.png" alt="Leer más" title="Leer más información"></a>
        </div><!-- /#service-hp -->

 <?php endwhile; endif; wp_reset_query(); 
        $content = ob_get_contents(); ob_end_clean();

                       return $content;

 }

add_shortcode('myloop', 'loop_shortcode');
25 nov 2011 08:21:47