Ethan's Blog

记录和思考

WordPress 相关文章的代码实现

WordPress 的相关文章插件很多,实现起来也很简单,同样使用代码实现也是非常快捷的,下面记录一下 WordPress 相关文章的代码实现方法。

一般来说,相关文章有几种逻辑来判断是不是相关的,常见的有标签相关、分类相关、作者相关等,常见的相关文章的实现代码基本也是基于这几种逻辑中的一种或者几种进行排列组合。我认为最好的相关文章应该是将这几个因素结合起来,不过考虑到代码实现也不要弄得太复杂,因此我们只取一个标准来判断相关性,那就是根据标签来确定相关性。

首先获取文章的所有标签,接着获取这些标签下的 n 篇文章,那么这 n 篇文章就是与该文章相关的文章了。现在可以见到的 WordPress 相关文章插件基本都是使用的这个方法。但是也有考虑到的情况是某些文章不具有足够数量的相关文章,为了在格式上的统一和和谐,我加入了一个判断,如果相关文章不够的话,再随机产生几篇文章补足,所以我就这个命名为 Related & Recommended Posts。下面是实现的代码:

<?php
echo '<h3>Related & Recommended Posts</h3><ul>';
global $post, $wpdb;
$random_posts_num = 6; //随机文章最大值
$post_tags = wp_get_post_tags($post->ID);
if ($post_tags) {
    $tag_list = '';
    foreach ($post_tags as $tag) {
        $tag_list .= $tag->term_id . ',';
    }
    $tag_list = substr($tag_list, 0, strlen($tag_list) - 1);
    $related_posts = $wpdb->get_results("
SELECT DISTINCT ID, post_title
FROM {$wpdb->prefix}posts, {$wpdb->prefix}term_relationships, {$wpdb->prefix}term_taxonomy
WHERE {$wpdb->prefix}term_taxonomy.term_taxonomy_id = {$wpdb->prefix}term_relationships.term_taxonomy_id
AND ID = object_id
AND taxonomy = 'post_tag'
AND post_status = 'publish'
AND post_type = 'post'
AND term_id IN (" . $tag_list . ")
AND ID != '" . $post->ID . "'
LIMIT 6"); //相关文章的数量,同随机文章最大值
    if ($related_posts) {
        $related_posts = array_reverse($related_posts, true);
        foreach ($related_posts as $related_post) {
            $random_posts_num--; //每多一篇相关文章则减少一篇随机文章
            ?>
<li><a href="<?php echo get_permalink($related_post->ID); ?>" rel="bookmark" title="<?php echo $related_post->post_title; ?>"><?php echo $related_post->post_title; ?></a></li>
<?php }
    }
    if ($random_posts_num > 0) {
        $randompost = new WP_Query(); //实例化
        $randompost->query(array('orderby' => 'rand', 'showposts' => $random_posts_num));
        while ($randompost->have_posts()) : $randompost->the_post(); ?>
<li><a href="<?php the_permalink(); ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a></li>
<?php endwhile;
        wp_reset_query();
    }
}
echo '</ul>'; ?>

只需要将这段代码拷贝到希望显示相关文章的地方保存即可。

相关文章: