在 WordPress 插件开发中,我们经常需要实现一些复杂但实用的功能。今天我想分享一个我最近开发的方法 —— 智能用户推荐系统。这个方法可以根据用户的创作活跃度(至少发布三篇文章)进行筛选,并在当前用户已登录的情况下排除其已经关注的用户。
这个功能非常适合用于社交化内容平台、博客社区或知识分享网站,帮助用户发现新的优质作者。
功能概述
该功能的核心逻辑如下:
- 筛选出至少发布过 3 篇文章的用户;
- 如果当前用户已登录,则排除其已经关注的用户;
- 返回一位符合条件的推荐用户及其最近发布的三篇文章信息。
核心代码解析
以下是我写的完整函数 recommend_user()
,我们将逐步分析其实现方式。
function recommend_user($current_user_id = 0)
{
global $wpdb;
// 获取当前用户已关注的用户 ID 列表
$exclude_user_ids = [];
if ($current_user_id) {
$table_name_followers = $wpdb->prefix . 'thinkpress_user_followers';
$followed_authors_query = $wpdb->prepare(
"SELECT following_id FROM $table_name_followers WHERE follower_id = %d",
$current_user_id
);
$exclude_user_ids = $wpdb->get_col($followed_authors_query);
}
// 构建 SQL 排除条件
$exclude_condition = '';
if (!empty($exclude_user_ids)) {
$exclude_condition = 'AND u.ID NOT IN (' . implode(',', array_map('intval', $exclude_user_ids)) . ')';
}
// 查询满足条件的用户(至少发表 3 篇文章)
$user_query = $wpdb->prepare("
SELECT u.ID AS user_id, MAX(p.post_date) AS latest_post_date
FROM {$wpdb->users} u
JOIN {$wpdb->posts} p ON u.ID = p.post_author
WHERE p.post_type IN ('post', 'impression')
AND p.post_status = 'publish'
{$exclude_condition}
GROUP BY u.ID
HAVING COUNT(p.ID) >= 3
ORDER BY latest_post_date DESC
LIMIT 1
", ARRAY_A);
$recommended_user = $wpdb->get_row($user_query);
if (!$recommended_user) {
return null;
}
$user_id = $recommended_user->user_id;
$user_latest_post_date = $recommended_user->latest_post_date;
// 获取用户基本信息
$user_data = get_userdata($user_id);
$custom_avatar = get_user_meta($user_id, 'custom_avatar', true);
// 获取该用户最近的三篇文章数据
$post_query = $wpdb->prepare("
SELECT p.ID AS post_id, p.post_type
FROM {$wpdb->posts} p
WHERE p.post_author = %d
AND p.post_type IN ('post', 'impression')
AND p.post_status = 'publish'
ORDER BY p.post_date DESC
LIMIT 3
", $user_id);
$recent_posts = $wpdb->get_results($post_query, ARRAY_A);
$posts_data = [];
foreach ($recent_posts as $post) {
$post_id = $post['post_id'];
$post_type = $post['post_type'];
// 获取缩略图信息
$featured_image = handle_the_thumbnail($post_id, $post_type);
$posts_data[] = [
'post_id' => $post_id,
'post_type' => $post_type,
'featured_image' => $featured_image
];
}
// 返回推荐用户的信息及最近三篇文章数据
return [
'id' => time(),
'user_id' => $user_id,
'post_type' => 'recommend_user',
'display_name' => $user_data ? $user_data->display_name : '',
'custom_avatar' => $custom_avatar,
'latest_post_date' => $user_latest_post_date,
'recent_posts' => $posts_data,
];
}
实现细节说明
1. 用户关注关系查询
我们通过自定义表 thinkpress_user_followers
来存储用户之间的关注关系(follower_id
和 following_id
)。当传入 $current_user_id
时,会先获取该用户已经关注的所有作者,并将其加入排除列表。
$table_name_followers = $wpdb->prefix . 'thinkpress_user_followers';
$followed_authors_query = $wpdb->prepare(
"SELECT following_id FROM $table_name_followers WHERE follower_id = %d",
$current_user_id
);
$exclude_user_ids = $wpdb->get_col($followed_authors_query);
注意:如果你使用的是其他插件或主题的用户关注机制,请根据实际数据结构调整这部分查询逻辑。
2. 筛选活跃用户
接下来我们通过 JOIN
操作连接了 wp_users
和 wp_posts
表,确保只选择那些发表了至少三篇“公开”状态文章的用户。
SELECT u.ID AS user_id, MAX(p.post_date) AS latest_post_date
FROM wp_users u
JOIN wp_posts p ON u.ID = p.post_author
WHERE p.post_type IN ('post', 'impression')
AND p.post_status = 'publish'
AND u.ID NOT IN (...)
GROUP BY u.ID
HAVING COUNT(p.ID) >= 3
ORDER BY latest_post_date DESC
LIMIT 1
HAVING COUNT(p.ID) >= 3
是关键条件,保证用户有至少三篇文章。MAX(p.post_date)
可以用来排序,优先推荐最近活跃的用户。
3. 获取推荐用户的最新三篇文章
我们再次查询推荐用户的最近三篇文章,并提取每篇文章的类型和缩略图信息。
$post_query = $wpdb->prepare("
SELECT p.ID AS post_id, p.post_type
FROM wp_posts p
WHERE p.post_author = %d
AND p.post_type IN ('post', 'impression')
AND p.post_status = 'publish'
ORDER BY p.post_date DESC
LIMIT 3
", $user_id);
这里有一个自定义函数 handle_the_thumbnail()
用于获取文章缩略图。
4. 返回结构化数据
最后,我们构建了一个数组,包含用户的基本信息和最近三篇文章的数据,方便前端调用渲染。
使用建议
你可以将这个方法封装到自己的 WordPress 插件中,并通过 REST API 或短代码(shortcode)提供给前端使用。
例如:
add_shortcode('recommend_user', function () {
$current_user_id = get_current_user_id();
$recommended_user = recommend_user($current_user_id);
if (!$recommended_user) {
return '<p>暂无推荐用户。</p>';
}
// 渲染推荐用户 HTML
ob_start();
include plugin_dir_path(__FILE__) . 'templates/recommended-user.php';
return ob_get_clean();
});
总结
本文介绍了如何在 WordPress 插件中实现一个基于用户活跃度的智能推荐系统。通过结合数据库查询与 WordPress 内置函数,我们可以轻松地为用户提供个性化的推荐体验。
如果你正在开发一个社交型 WordPress 站点,这样的推荐逻辑非常值得借鉴。