Query mai eficient pentru a afișa postări din aceeași sub-categorie?

30 oct. 2014, 16:04:12
Vizualizări: 297
Voturi: 0

[EDIT: Vezi comentariul meu mai jos, este posibil să fi fost păcălit de cache-ul Chrome care a afișat o versiune anterioară a acestui cod. Acum pare să ruleze destul de repede. Las întrebarea aici în caz că cineva vede o metodă mai bună, dar nu vă faceți griji prea mult dacă nu - voi închide această întrebare în câteva zile.]

Mulți oameni au postat cod similar pentru a afișa 'postări similare' în bara laterală, iar eu l-am adaptat într-un shortcode. Funcționează, dar durează 1-2 secunde să se încarce pe localhost. Pot adăuga caching cu transient, dar având în vedere că este un query specific fiecărui post, nu cred că va ajuta foarte mult (sau mă înșel?). Există o metodă mai eficientă de a scrie acest cod?

// SHORTCODE PENTRU AFIȘAREA POSTĂRILOR SIMILARE ÎN BARA LATERALĂ
// Afișează postări din aceeași sub-categorie cu postul curent
// utilizare: [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ște atributele și valorile lor implicite
    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) {
            // caută doar sub-categoriile curente
            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 = '';
    // rulează loop-ul bazat pe 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;
}

Mulțumesc!

Michelle
Michelle
3.46K
Comentarii

Unde exact folosești asta?

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

OK, uau! codul era într-un "plugin", practic shortcode-urile mele copiate într-un fișier plugin.php ca să nu fie în functions.php. Când am văzut întrebarea ta, am încercat să mut codul în functions.php și părea să se încarce mult mai repede (Debug Queries încă dădea același rezultat, dar sidebar-ul pare să se încarce instant acum). L-am mutat înapoi în plugin, și la fel - încă o experiență mai rapidă. Poate am fost păcălit de cache-ul Chrome care a salvat o versiune anterioară care arunca notificări PHP?? (Dacă te întrebi unde apelez shortcode-ul, este în widget-ul TinyMCE al Black Studio din sidebar-ul unei pagini de postare individuală.)

Michelle Michelle
30 oct. 2014 17:29:07

Crearea unui Widget în loc să utilizezi un shortcode pentru această funcționalitate ar fi benefic.

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

Aș fi de acord cu @ialocin aici.

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

Apropo, nu văd un motiv pentru care nu ai putea/ar trebui să lucrezi cu transiente aici, singurele lucruri de care trebuie să te asiguri sunt: că transientele sunt identificabile după tipul de postare (tipurile de postare) și să le actualizezi în consecință - deci este cu siguranță posibil, dar necesită ceva muncă.

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

@ialocin Clientul meu nu este sigur dacă dorește acest lucru în bara laterală sau după conținutul postării, de aceea shortcode-ul. Din curiozitate, de ce ar fi benefic un widget? S-ar încărca mai repede decât un shortcode?

Michelle Michelle
30 oct. 2014 18:11:27

Bine, am înțeles. Nu neapărat, dar un widget s-ar încărca mai repede decât un shortcode într-un widget, pur și simplu pentru că este imediat fără a ocoli prin API-ul de shortcode.

Nicolai Grossherr Nicolai Grossherr
30 oct. 2014 19:04:54
Arată celelalte 2 comentarii