我们知道 WordPress 相关文章插件是通过 tag 和分类来获取相关文章,文章使用相同的 tag 和分类越多,则认为为相关性越强,这样就需要进行多个表联合查询来获取相关文章,连表查询效率一般是比较差的。比如下面是一个比较通用的从数据库中查找相关文章的函数:
function wpjam_get_related_posts($post_id){
global $wpdb;
$term_ids = wp_get_post_terms($post_id, ['category', 'post_tag'], ['fields' => 'ids']);
$terms_ids = implode(',', $term_ids);
$related_posts = $wpdb->get_results("
SELECT object_id, COUNT(*) as count
FROM $wpdb->term_relationships
WHERE term_taxonomy_id IN ($terms_string) AND object_id != $post_id
GROUP BY object_id
ORDER BY count DESC
LIMIT 10"
);
foreach($related_posts as &$post){
$post = get_post($post->object_id);
}
return $related_posts;
}
上面的函数,首先获取文章的标签和分类,然后基于使用相同的标签和分类的数量,通过 SQL 获取相似度最高的 10 篇文章的 ID,然后再相应获取对应的文章(这里为了简化,一般应该要根据文章 ID 批量文章,防止同时多条 SQL 请求)。
我们知道 WordPress 相关文章插件是通过 tag 和分类来获取相关文章,文章使用相同的 tag 和分类越多,则认为为相关性越强,这样就需要进行多个表联合查询来获取相关文章,连表查询效率一般是比较差的。比如下面是一个比较通用的从数据库中查找相关文章的函数:
function wpjam_get_related_posts($post_id){
global $wpdb;
$term_ids = wp_get_post_terms($post_id, ['category', 'post_tag'], ['fields' => 'ids']);
$terms_ids = implode(',', $term_ids);
$related_posts = $wpdb->get_results("
SELECT object_id, COUNT(*) as count
FROM $wpdb->term_relationships
WHERE term_taxonomy_id IN ($terms_string) AND object_id != $post_id
GROUP BY object_id
ORDER BY count DESC
LIMIT 10"
);
foreach($related_posts as &$post){
$post = get_post($post->object_id);
}
return $related_posts;
}
上面的函数,首先获取文章的标签和分类,然后基于使用相同的标签和分类的数量,通过 SQL 获取相似度最高的 10 篇文章的 ID,然后再相应获取对应的文章(这里为了简化,一般应该要根据文章 ID 批量文章,防止同时多条 SQL 请求)。
所以它接口函数和 WordPress 的 Option API (get_option, add_option, update_option, delete_option))基本一样,唯一区别就是 Transients API 有一个过期时间,并且它没有 add 方法,统一合并成 set 了,所以 WordPress Transients API 有以下三个函数: