Shortcode para Mostrar Tipos de Entradas Personalizadas

18 jul 2012, 17:06:16
Vistas: 17.4K
Votos: 3

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 &raquo;' . '</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">&larr;</span> Entradas anteriores' ) ) . '</div>'
    . '<div class="nav-next">' . previous_posts_link( __( 'Entradas más recientes <span class="meta-nav">&rarr;</span>' ) ) . '</div>'
    . '</div>' .
    wp_reset_query();

}
add_shortcode( 'feed', 'section_feed_shortcode' );
2
Comentarios

¿cuál es la ventaja de hacerlo de esta manera? Parece mucho esfuerzo cuando WordPress ya maneja archivos de tipos de contenido personalizados con paginación adecuada. Además, es ineficiente hacer una segunda consulta cuando no es necesario. Ni siquiera necesitas crear una plantilla especial ya que WordPress recurrirá a archives.php o incluso index.php. Si solo necesitas agregarlos al menú, existe http://wordpress.org/extend/plugins/cpt-archives-in-nav-menus/

helgatheviking helgatheviking
18 jul 2012 17:27:41

Bueno, el beneficio es que puedo colocarlos donde quiera, y si puedo colocarlos en una página normal dentro de WordPress, puedo agregar contenido arriba y abajo del shortcode. Cada sección tiene contenido arriba y abajo de los listados; si creo una plantilla, todo este contenido tendría que estar codificado directamente en la plantilla, lo que dificulta las actualizaciones rápidas. Necesito que el contenido en estas páginas de sección sea fácilmente actualizable.

Aaron Aaron
18 jul 2012 17:36:20
Todas las respuestas a la pregunta 1
4

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:

  1. next_posts_link y previous_posts_link ambos hacen echo, necesitas sus equivalentes get_.

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

  3. 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 &raquo;' . '</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">&larr;</span> Entradas anteriores' ) ) . '</div>'
    . '<div class="nav-next">' . get_previous_posts_link( __( 'Entradas más recientes <span class="meta-nav">&rarr;</span>' ) ) . '</div>'
    . '</div>' .
    wp_reset_query();
    
    }
    add_shortcode( 'feed', 'section_feed_shortcode' );
    
18 jul 2012 20:40:26
Comentarios

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

Aaron Aaron
19 jul 2012 14:54:03

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

helgatheviking helgatheviking
19 jul 2012 17:12:52

¡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!

Aaron Aaron
20 jul 2012 17:20:23

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

helgatheviking helgatheviking
20 jul 2012 19:14:59