Código corto para mostrar un bucle
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

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:

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?

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

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

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

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');
