Shortcode para Mostrar Tipos de Entradas Personalizadas
Tengo un problema con un shortcode que estoy creando.
Tengo entre 5-10 tipos de entradas personalizadas diferentes, y en lugar de crear una plantilla para cada tipo de entrada, prefiero usar una página normal e importar las entradas mediante un shortcode.
Para explicar mejor, tengo una página llamada "Atracciones" y un tipo de entrada llamado 'Atracción'. En la página inserto el shortcode -> [feed type="attraction" limit="5"]
Esto muestra todas las entradas del tipo de entrada personalizada "attraction".
El problema que tengo es hacer que la paginación funcione correctamente. He leído mil formas de paginar custom post types, y el código que estoy usando actualmente parece funcionar según muchas personas, pero no puedo hacer que funcione dentro del shortcode. ¿Hay alguna razón para esto?
Actualmente la página se muestra bien, con cinco entradas, pero no muestra los enlaces de siguiente/anterior. Si escribo en la URL + /page/2, la segunda página se muestra correctamente con las siguientes 5 entradas. Así que parece que la paginación funciona, pero no puedo acceder porque no aparecen los enlaces Siguiente/Anterior.
El beneficio de hacerlo así es que puedo usar una página normal, importar las entradas, y puedo incluir contenido arriba y abajo del shortcode.
Espero que esto tenga sentido.
Aquí está mi código del shortcode -->
function section_feed_shortcode( $atts ) {
extract( shortcode_atts( array( 'limit' => -1, 'type' => 'post'), $atts ) );
global $paged;
$q = new WP_Query( array (
'posts_per_page' => $limit,
'post_type' => $type,
order => 'ASC',
orderby =>'menu_order',
'paged' => $paged ) );
$list = ' ';
while ( $q->have_posts() ) { $q->the_post();
$list .= '<article class="listing-view clearfix">'
. '<div class="listing-content">'
. '<h3><a href="' . get_permalink() . '">' . get_the_title() . '</a></h3>'
.'<p>' . get_the_excerpt() . '</p>'
. '<a href="' . get_permalink() . '">' . 'Ver »' . '</a>'
. '</div>'
. '<a class="listing-thumb" href="' . get_permalink() . '">' . get_the_post_thumbnail($page->ID, 'listing-thumb') . '<span></span></a>'
. '</article>';
}
return
'<div class="listings clearfix">'
. $list
. '<div class="nav-previous">' . next_posts_link( __( '<span class="meta-nav">←</span> Entradas anteriores' ) ) . '</div>'
. '<div class="nav-next">' . previous_posts_link( __( 'Entradas más recientes <span class="meta-nav">→</span>' ) ) . '</div>'
. '</div>' .
wp_reset_query();
}
add_shortcode( 'feed', 'section_feed_shortcode' );
ok, todavía no me encanta la idea de una segunda consulta, pero tienes razón, es difícil agregar contenido a las páginas de archivos.
encontré 3 problemas:
next_posts_link y previous_posts_link ambos hacen echo, necesitas sus equivalentes get_.
cuando buscas get_next_posts_link, descubres que depende de la global $wp_query... que en tu caso siempre era para la "página" actual y no para la consulta del shortcode. necesitas hacer query_posts y sobreescribir la consulta original. espero que el reset query funcione, pero no estoy 100% seguro. tendrás que probarlo.
no estoy seguro si esto era un problema, pero usualmente veo la variable $paged definida así, así que seguí con eso.
function section_feed_shortcode( $atts ) { extract( shortcode_atts( array( 'limit' => -1, 'type' => 'post'), $atts ) ); $paged = get_query_var('paged') ? get_query_var('paged') : 1; query_posts( array ( 'posts_per_page' => $limit, 'post_type' => $type, 'order' => 'ASC', 'orderby' =>'menu_order', 'paged' => $paged ) ); $list = ' '; while ( have_posts() ) { the_post(); $list .= '<article class="listing-view clearfix">' . '<div class="listing-content">' . '<h3><a href="' . get_permalink() . '">' . get_the_title() . '</a></h3>' .'<p>' . get_the_excerpt() . '</p>' . '<a href="' . get_permalink() . '">' . 'Ver »' . '</a>' . '</div>' . '<a class="listing-thumb" href="' . get_permalink() . '">' . get_the_post_thumbnail($page->ID, 'listing-thumb') . '<span></span></a>' . '</article>'; } return '<div class="listings clearfix">' . $list . '<div class="nav-previous">' . get_next_posts_link( __( '<span class="meta-nav">←</span> Entradas anteriores' ) ) . '</div>' . '<div class="nav-next">' . get_previous_posts_link( __( 'Entradas más recientes <span class="meta-nav">→</span>' ) ) . '</div>' . '</div>' . wp_reset_query(); } add_shortcode( 'feed', 'section_feed_shortcode' );

¡Muchas gracias @helgatheviking! Aún no lo he probado, pero te avisaré del resultado cuando tenga la oportunidad de hacerlo. Realmente agradezco que hayas revisado esto por mí.

Por supuesto, si realmente funciona, por favor márcalo como la respuesta. Si no, déjame saber qué está sucediendo en su lugar.

¡Gracias! Funcionó perfectamente. Solo me pregunto por qué, soy un poco novato cuando se trata de WordPress, sin embargo, siempre pensé que usar wp_query era más robusto y tenía más funcionalidad que query_posts. ¡Gracias de nuevo!

hasta donde yo sé, son lo mismo. WP_query nuevo simplemente almacena un objeto 'nuevo' en lugar de sobrescribir la consulta original de la página, lo cual generalmente es más seguro en términos de no estropear la paginación/bucles. pero como los enlaces siguiente y anterior dependen de la variable global $wp_query, tienes que cambiarla con query_posts
