¿Consulta más eficiente para mostrar publicaciones en la misma subcategoría?

30 oct 2014, 16:04:12
Vistas: 297
Votos: 0

[EDITAR: Ver mi comentario abajo, puede que me haya engañado el caché de Chrome mostrando una versión anterior del código. Ahora parece ejecutarse bastante rápido. Dejo la pregunta por si alguien ve una mejor forma, pero no te preocupes demasiado si no - cerraré esto en un par de días.]

Mucha gente ha publicado códigos como este para mostrar 'publicaciones relacionadas' en la barra lateral, y lo he adaptado en un shortcode. Funciona, pero tarda 1-2 segundos en cargar en localhost. Puedo añadir caché transitorio pero dado que es una consulta por tipo de publicación, no ayudará mucho (¿o sí?). ¿Hay una forma más eficiente de escribir esto?

// SHORTCODE PARA MOSTRAR PUBLICACIONES RELACIONADAS EN LA BARRA LATERAL
// Muestra publicaciones en la misma subcategoría que la publicación actual
// uso: [related_posts posts="5"]
add_shortcode( 'related_posts', 'mkm_related_posts_shortcode' );
function mkm_related_posts_shortcode( $atts ) {
    ob_start();

    $current_post_id = get_queried_object_id();

    // define atributos y sus valores por defecto
    extract( shortcode_atts( array (
        'type' => 'post',
        'order' => 'asc',
        'orderby' => 'menu_order',
        'posts' => '3',
    ), $atts ) );

    $categories = get_the_category($current_post_id);
    if ($categories) {
        $category_ids = array();

        foreach($categories as $individual_category) {
            // buscando solo subcategorías actuales
            if ( $individual_category->parent !== 0 ) {
                $category_ids[] = $individual_category->term_id;
            }
        }
    }

        $options = array(
            'post_type' => $type,
            'order' => $order,
            'orderby' => $orderby,
            'posts_per_page' => $posts,
            'category__in' => $category_ids,
            'post__not_in' => array($current_post_id),
        );

        $related_query = new WP_Query( $options );

    $output = '';
    // ejecuta el loop basado en la consulta
    if ( $related_query->have_posts() ) { 
        $alttext = the_title_attribute('echo=0');
        $output .= '<ul>';
        while ( $related_query->have_posts() ) { 
            $related_query->the_post(); 
            $output .= '<li>';
            $output .= '<h5 class="related-title"><a href="' . get_permalink() . '">' . get_the_title() . '</a></h5>';

            if( has_post_thumbnail($related_query->post->ID) ) { 
                $output .= '<a href="' . get_permalink() . '">' . get_the_post_thumbnail($related_query->post->ID, 'tiny-thumb', array( 'alt' =>  $alttext )) . '</a>';
            }

            $output .= '</li>';
        } 
        $output .= '</ul>';
    }

    ob_get_clean();
    wp_reset_postdata();
    return $output;
}

¡Gracias!

Michelle
Michelle
3.46K
Comentarios

¿Dónde exactamente estás usando esto?

Pieter Goosen Pieter Goosen
30 oct 2014 16:43:03

¡OK, guau! El código estaba en un "plugin", básicamente mis shortcodes copiados en un archivo plugin.php para que no estuvieran en functions.php. Cuando vi tu pregunta, intenté mover el código a functions.php y pareció acelerarse enormemente (Debug Queries aún daba el mismo resultado, pero la barra lateral ahora parece cargar instantáneamente). Lo volví a mover al plugin, y lo mismo: sigue siendo una experiencia más rápida. ¿Puede que me haya engañado el caché de Chrome mostrando una versión anterior que estaba lanzando avisos de PHP? (Si te refieres a dónde llamo al shortcode, está en el widget TinyMCE de Black Studio en la barra lateral de una página de publicación única).

Michelle Michelle
30 oct 2014 17:29:07

Crear un Widget en lugar de utilizar un shortcode para esta funcionalidad sería beneficioso.

Nicolai Grossherr Nicolai Grossherr
30 oct 2014 17:41:36

Estoy de acuerdo con @ialocin aquí.

Pieter Goosen Pieter Goosen
30 oct 2014 17:44:22

Por cierto, no veo ninguna razón por la que no podrías/deberías trabajar con transients aquí, lo único que tienes que asegurarte es: que los transients sean identificables por el tipo(s) de post y actualizarlos en consecuencia - así que es totalmente factible, pero requiere algo de trabajo.

Nicolai Grossherr Nicolai Grossherr
30 oct 2014 17:49:47

@ialocin Mi cliente no está seguro si quiere esto en la barra lateral o después del contenido del post, de ahí el shortcode. Por curiosidad, ¿por qué sería beneficioso un widget? ¿se renderizaría más rápido que un shortcode?

Michelle Michelle
30 oct 2014 18:11:27

Vale, ya veo. No necesariamente, pero un widget se renderizaría más rápido que un shortcode en un widget, simplemente porque es inmediato sin desvío a través de la API de shortcode.

Nicolai Grossherr Nicolai Grossherr
30 oct 2014 19:04:54
Mostrar los 2 comentarios restantes