Vyhľadanie súvisiacich článkov vo worpdresse po druhé

Dnes Vám ukážem jednoduchý spôsob ako vo worpdresse získať súvisiace články pre daný post.

O vyhľadávaní súvisiacich článkov som napísal už dva príspevky, čiže ak mi to správne funguje tu na blogu, tak by ste ich mali vidieť pod článkom ;).

Každopádne v tomto článku nebudeme preberať teóriu, ale vám ukážem funkciu pomocou ktorej môžete články nájsť. Sql pre funkciu som zobral z pluginu WordPress Related Posts a trochu som to upravil, aby som mohol filtrovať články podľa kategórií. To je dobré vtedy ak máte na webe viac hlavných kategórií ako napríklad články, fotky, videá a pre články chcete nájsť len súvisiace články a nie aj súvisiace fotky, ktoré vôbec nemusia s článkom súvisieť, ale len budu mať priradený rovnaký tag (kľúčové slovo).

Tu je kód funkcie:

function get_related_posts($categories = null, $limit = 0) {
	global $wpdb, $post;
	
	$now = current_time('mysql', 1);

	/* získame všetky tagy pre daný post */
	$tags = wp_get_post_tags($post->ID);

        /* ak post nemá pridelené žiadne tagy tak nemá význam hľadať súvisiace príspevky a vrátime false */
	if(empty($tags)) {
		return false;
	}

        /* vytvoríme si reťazec obsahujúci ID tagov oddelené čiarkou
         * tento reťazec použijeme v SQL dotaze */
	foreach($tags as $tag) {
		$taglist[] = $tag->term_id;
	}
	$taglist = implode(',', $taglist);
	
        /* vytvoríme vnorený SELECT */
	$sql = "SELECT p.*, count(t_r.object_id) as cnt 
			FROM $wpdb->term_taxonomy t_t, $wpdb->term_relationships t_r, $wpdb->posts p 
			WHERE 
				t_t.taxonomy ='post_tag' 
				AND t_t.term_taxonomy_id = t_r.term_taxonomy_id 
				AND t_r.object_id  = p.ID 
				AND (t_t.term_id IN ($taglist)) 
				AND p.ID!= $post->ID 
				AND p.post_status = 'publish' 
				AND p.post_date_gmt < '$now' 
			GROUP BY t_r.object_id 
			ORDER BY cnt DESC, p.post_date_gmt DESC";
	$sql = "SELECT * 
			FROM ($sql) p,
				$wpdb->term_taxonomy t_t, 
				$wpdb->term_relationships t_r
			WHERE
				t_t.taxonomy = 'category'
				AND t_t.term_taxonomy_id = t_r.term_taxonomy_id 
				AND t_r.object_id  = p.ID";
	if(!empty($categories)) {
		$sql .= ' AND t_t.term_id IN (' . implode(',', $categories) . ')';
	}
	if($limit != 0) {
		$sql .= ' LIMIT ' . absint($limit);
	}

        /* získame údaje z DB */
	$result = $wpdb->get_results($sql);

        /* a nájdené posty pridáme do cache */
	foreach($result as $post) {
		wp_cache_add($post->ID, $post, 'posts');
	}
	return $result;
}

Funkcia get_related_post(), nám vráti súvisiace články (posty) zoradené podľa toho koľko kľúčových slov (tagov) majú spoločných s článkom pre ktorý sme ich hľadali.

Nasledujúci príklad vypíše maximálne 5 súvisiaciach článkov z kategórií s ID 1, 2, alebo 3:

<?php foreach(get_related_posts(array(1,2,3), 5) as $post) { ?>
	<?php //setup_postdata($post); treba odkomentovať ak chceme použiť napríklad the_content() ?>
	<div class="related-article">
		<h6><a href="<?php the_permalink();?>"><?php the_title(); ?></a></h6>
		<?php the_excerpt(); ?>
	</div>
<?php }?>

Posted

in

by

Comments

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *