Query più efficiente per visualizzare post nella stessa sottocategoria?

30 ott 2014, 16:04:12
Visualizzazioni: 297
Voti: 0

[MODIFICA: Vedi il mio commento sotto, potrei essere stato ingannato dalla cache di Chrome che mostrava una versione precedente di questo codice. Ora sembra funzionare abbastanza velocemente. Lascio la domanda nel caso qualcuno veda un modo migliore ma non preoccupatevi troppo se non ci sono soluzioni - chiuderò tra qualche giorno.]

Molte persone hanno pubblicato codice come questo per mostrare 'post correlati' nella sidebar, e l'ho adattato in uno shortcode. Funziona, ma impiega 1-2 secondi per caricare su localhost. Potrei aggiungere la cache transient ma dato che è una query per tipo di post non credo che aiuterebbe molto. C'è un modo più efficiente per scrivere questo codice?

// SHORTCODE PER MOSTRARE POST CORRELATI NELLA SIDEBAR
// Mostra post nella stessa sottocategoria del post corrente
// utilizzo: [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();

    // definisce gli attributi e i loro valori predefiniti
    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) {
            // cerca solo le sottocategorie correnti
            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 = '';
    // esegue il loop basato sulla query
    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;
}

Grazie!

Michelle
Michelle
3.46K
Commenti

Dove esattamente stai usando questo?

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

OK wow! Il codice era in un "plugin", fondamentalmente i miei shortcode copiati in un file plugin.php in modo che non fossero in functions.php. Quando ho visto la tua domanda, ho provato a spostare il codice in functions.php e sembra aver accelerato enormemente (Debug Queries ha ancora dato lo stesso risultato, ma la sidebar ora sembra caricarsi all'istante). L'ho spostato di nuovo nel plugin, e stessa cosa - esperienza ancora più veloce. Forse ero stato ingannato dalla cache di Chrome che memorizzava una versione precedente che generava avvisi PHP?? (Se intendi dove chiamo lo shortcode, è nel widget TinyMCE di Black Studio nella sidebar di una pagina di singolo post.)

Michelle Michelle
30 ott 2014 17:29:07

Creare un Widget invece di utilizzare uno shortcode per questa funzionalità sarebbe vantaggioso.

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

Sono d'accordo con @ialocin qui.

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

A proposito, non vedo motivi per cui non potresti/dovresti lavorare con i transient qui, le uniche cose di cui devi assicurarti sono: che i transient siano identificabili dal tipo di post e che vengano aggiornati di conseguenza - quindi è assolutamente fattibile, ma richiede un po' di lavoro.

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

@ialocin Il mio cliente non è sicuro se vuole questo nella sidebar o dopo il contenuto del post, da qui lo shortcode. Per curiosità, perché un widget sarebbe vantaggioso? renderizzerebbe più velocemente di uno shortcode?

Michelle Michelle
30 ott 2014 18:11:27

Ok, capisco. Non necessariamente, ma un widget verrebbe renderizzato più velocemente di uno shortcode in un widget, semplicemente perché è immediato senza il giro attraverso l'API degli shortcode.

Nicolai Grossherr Nicolai Grossherr
30 ott 2014 19:04:54
Mostra i restanti 2 commenti