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 }?>
Pridaj komentár