Cum să afișezi articolele conexe din aceeași categorie?

2 oct. 2011, 17:08:14
Vizualizări: 55.2K
Voturi: 17

Este posibil să afișezi articole conexe din aceeași categorie ca și articolul curent?

0
Toate răspunsurile la întrebare 4
4
32

O posibilitate:

$related = get_posts( 
    array( 
        'category__in' => wp_get_post_categories( $post->ID ), 
        'numberposts'  => 5, 
        'post__not_in' => array( $post->ID ) 
    ) 
);

if( $related ) { 
    foreach( $related as $post ) {
        setup_postdata($post);
        /*orice doriți să afișați*/
    }
    wp_reset_postdata();
}

Referințe:

Răspuns rescris bazat pe WP_Query():

$related = new WP_Query(
    array(
        'category__in'   => wp_get_post_categories( $post->ID ),
        'posts_per_page' => 5,
        'post__not_in'   => array( $post->ID )
    )
);

if( $related->have_posts() ) { 
    while( $related->have_posts() ) { 
        $related->the_post(); 
        /*orice doriți să afișați*/
    }
    wp_reset_postdata();
}
2 oct. 2011 18:07:14
Comentarii

Fii foarte atent cu denumirile variabilelor tale! Folosești o variabilă globală $post pentru a efectua interogarea, apoi redefinești $post în același context în interiorul buclei tale foreach.

EAMann EAMann
2 oct. 2011 19:15:21

@EAMann - în general ai dreptate - totuși, din experiența mea, folosirea setup_postdata() cu altceva decât $post nu oferă rezultatul corect pentru funcții precum the_title(). wp_reset_postdata() ar trebui în teorie să se ocupe de resetarea variabilei $post.

Michael Michael
2 oct. 2011 20:08:25

Asta se întâmplă pentru că setup_postdata() însăși face referire la $post ca variabilă globală. În loc să folosești get_posts(), ar trebui să definești o instanță personalizată a WP_Query și să o folosești pentru a obține postările. Aceasta va configura automat datele postării și va face ca funcțiile precum the_title() să funcționeze așa cum ar trebui.

EAMann EAMann
3 oct. 2011 04:12:12

@EAMann Acesta este un articol destul de vechi, dar ar fi apreciat dacă ai putea scrie un răspuns despre cum să faci asta corect cu interogarea personalizată și toate cele

GiantCowFilms GiantCowFilms
25 nov. 2015 17:47:47
1

Iată o altă opțiune curată și foarte flexibilă:

Puneți acest cod în fișierul functions.php

function example_cats_related_post() {

    $post_id = get_the_ID();
    $cat_ids = array();
    $categories = get_the_category( $post_id );

    if(!empty($categories) && is_wp_error($categories)):
        foreach ($categories as $category):
            array_push($cat_ids, $category->term_id);
        endforeach;
    endif;

    $current_post_type = get_post_type($post_id);
    $query_args = array( 

        'category__in'   => $cat_ids,
        'post_type'      => $current_post_type,
        'post__not_in'    => array($post_id),
        'posts_per_page'  => '3'


     );

    $related_cats_post = new WP_Query( $query_args );

    if($related_cats_post->have_posts()):
         while($related_cats_post->have_posts()): $related_cats_post->the_post(); ?>
            <ul>
                <li>
                    <a href="<?php the_permalink(); ?>">
                        <?php the_title(); ?>
                    </a>
                    <?php the_content(); ?>
                </li>
            </ul>
        <?php endwhile;

        // Restaurați datele originale Post
        wp_reset_postdata();
     endif;

}

Acum puteți apela simplu funcția oriunde pe site folosind:

<?php example_cats_related_post() ?>

Dacă doriți, puteți elimina elementele de listă sau le puteți stiliza după nevoile dumneavoastră.

*Edit - trebuie să schimbați asta: post_not_in în post__not_in în interogarea dumneavoastră

2 iul. 2018 14:58:51
Comentarii

Se afișează doar un singur articol. Este posibil să se afișeze toate articolele din aceeași categorie pe o pagină de categorie?

Rahul Rahul
29 aug. 2019 09:08:15
0

poți folosi acest cod pentru a obține articole conexe din aceeași categorie

$args = array(
                'category__in' => wp_get_post_categories( get_queried_object_id() ),
                'posts_per_page' => 5,
                'orderby'       => 'rand',
                'post__not_in' => array( get_queried_object_id() )
                );
    $the_query = new WP_Query( $args );

    if ( $the_query->have_posts() ) : ?>

        <ul class="">
        <!-- bucla -->
        <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>

            <li>
                <h6>
                    <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                    <?php the_title(); ?>
                    </a>
                </h6>
            </li>

        <?php endwhile; ?>
        <!-- sfârșitul buclei -->
        </ul>

        <?php wp_reset_postdata(); ?>

     <?php endif; ?>

și folosește acest cod pentru a obține articole conexe cu aceleași tag-uri

$tags = wp_get_post_terms( get_queried_object_id(), 'post_tag', ['fields' => 'ids'] );
    $args = [
        'post__not_in'        => array( get_queried_object_id() ),
        'posts_per_page'      => 5,
        'orderby'             => 'rand',
        'tax_query' => [
            [
                'taxonomy' => 'post_tag',
                'terms'    => $tags
            ]
        ]
    ];
    $the_query = new WP_Query( $args );
    if ( $the_query->have_posts() ) : ?>

        <ul class="">
        <!-- bucla -->
        <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>

            <li>
                <h6>
                    <a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>">
                    <?php the_title(); ?>
                    </a>
                </h6>
            </li>

        <?php endwhile; ?>
        <!-- sfârșitul buclei -->
        </ul>

        <?php wp_reset_postdata(); ?>

    <?php endif; ?>
2 dec. 2019 18:05:36
0

Acest răspuns se asigură că postările conexe sunt ordonate în funcție de câte etichete se potrivesc.

De exemplu, dacă un articol are 3 etichete și există un alt articol care are exact aceleași 3 etichete, acesta ar trebui să apară în partea de sus a listei. Sortarea secundară ar trebui să fie după data postării, astfel încât conținutul mai recent să fie favorizat.

/**
 * Selectează conținutul cu etichete comune.
 * Sortează astfel încât conținutul cu mai multe etichete potrivite să fie în partea de sus.
 * Sortare secundară după cel mai recent conținut.
 *
 * @param $post_id
 * @param int $limit
 * @return array
 */
function related_posts($post_id, $limit = 5) {

    global $wpdb;

    $query  = "SELECT TOP %d x.object_id as ID
FROM (
SELECT TOP 10 tr1.object_id, COUNT(tr1.term_taxonomy_id) AS common_tag_count
FROM {$wpdb->term_relationships} AS tr1
INNER JOIN {$wpdb->term_relationships} AS tr2 ON tr1.term_taxonomy_id = tr2.term_taxonomy_id
WHERE tr2.object_id = %d
GROUP BY tr1.object_id
HAVING tr1.object_id != %d
ORDER BY COUNT(tr1.term_taxonomy_id) DESC
) x
INNER JOIN {$wpdb->posts} p ON p.ID = x.object_id
ORDER BY common_tag_count DESC, p.post_date DESC;";

    $query = $wpdb->prepare($query, $limit, $post_id, $post_id);
    $ids = $wpdb->get_col($query);
    $posts = [];
    foreach($ids as $id)  {
        $posts[] = get_post($id);
    }

    return $posts;

}

Interogarea interioară de aici este pentru a selecta conținutul cu cele mai multe etichete potrivite, iar apoi interogarea exterioară este folosită doar pentru a aplica sortarea secundară după data postării.

Rețineți că această interogare este scrisă pentru SQL Server, așa că unele sintaxe pot necesita actualizare (de exemplu, TOP vs LIMIT).

20 aug. 2018 17:59:38