WordPress 插件开发:基于用户活跃度智能用户推荐功能的实现

在 WordPress 插件开发中,我们经常需要实现一些复杂但实用的功能。今天我想分享一个我最近开发的方法 —— 智能用户推荐系统。这个方法可以根据用户的创作活跃度(至少发布三篇文章)进行筛选,并在当前用户已登录的情况下排除其已经关注的用户。

这个功能非常适合用于社交化内容平台、博客社区或知识分享网站,帮助用户发现新的优质作者。

功能概述

该功能的核心逻辑如下:

  1. 筛选出至少发布过 3 篇文章的用户
  2. 如果当前用户已登录,则排除其已经关注的用户
  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_idfollowing_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_userswp_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 站点,这样的推荐逻辑非常值得借鉴。

+1

发表回复