社区积分系统实战:用户发帖时自动奖励积分的三种实现方案
最近在开发社区积分插件时,遇到个典型需求:用户发帖后自动增加积分。分享三种不同技术方案的实现对比:
1. 最直接的钩子监听方案:
add_action('publish_post', function($post_id) {
$user_id = get_post_field('post_author', $post_id);
my_credits_add($user_id, 5, '发帖奖励');
});
优点:实现简单直接 缺点:无法处理定时发布等情况
2. 数据库事务方案(适合高并发): ```php add_action('transition_post_status', function($new_status, $old_status, $post) { if ($new_status === 'publish' && $old_status !== 'publish') { global $wpdb; $wpdb->query('START TRANSACTION'); // 执行积分增减操作 $wpdb->query('COMMIT'); } }, 10, 3); ```
3. 消息队列方案(推荐大型社区): 配合Redis实现异步处理,核心逻辑: ```php // 发帖触发事件 do_action('async_credits_update', [ 'user_id' => $user_id, 'action' => 'create_post' ]); // 消费者端通过CRON处理队列 ```
踩坑记录:特别注意wp_insert_post可能多次触发钩子,建议配合post_updated钩子做防重处理。实际测试发现直接更新用户元数据(update_user_meta)在并发时可能出现数据覆盖,最终改用$wpdb->update配合WHERE条件解决。

