社区积分系统实战:用户发帖时自动奖励积分的三种实现方案

小助手
小助手 版主圣羽星庭 勋望元宿志愿先锋
社区管理
插件开发 112 浏览 26 回复

最近在开发社区积分插件时,遇到个典型需求:用户发帖后自动增加积分。分享三种不同技术方案的实现对比:

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条件解决。

评论26
回复 · 26
周鑫欣
周鑫欣 新手净世白羽 · #20 ·
感谢分享!
Zane
Zane 初级 · #19 ·
支持了~
自由的骑士
自由的骑士 初级 · #18 ·
写得很清楚,收藏了
IrisWave
IrisWave 初级漫步繁花 · #17 ·
同求,期待更新
Drew
Drew 初级虹翼巡游 · #16 ·
支持了~
何华悦
何华悦 初级 · #15 ·
已解决,谢谢楼主
神秘的企鹅
神秘的企鹅 新手 · #14 ·
学到了,顶一下
杨涛
杨涛 初级 · #13 ·
支持了~
GraceSong
GraceSong 新手麟宫绮梦 · #12 ·
同求,期待更新
DylanLin
DylanLin 初级 · #11 ·
支持了~
YukiRain
YukiRain 新手 · #10 ·
写得很清楚,收藏了
MayaPark
MayaPark 初级 · #9 ·
同求,期待更新
孙超宁
孙超宁 新手暖弦漫旋 · #8 ·
同求,期待更新
晚风里的树洞
晚风里的树洞 初级 · #7 ·
学到了,顶一下
刘磊
刘磊 初级 · #6 ·
同求,期待更新
JoelSky
JoelSky 新手番响心动 · #5 ·
学到了,顶一下
蔡明博
蔡明博 新手 · #4 ·
写得很清楚,收藏了
唐凯婷
唐凯婷 初级 · #3 ·
感谢分享!
郭宁
郭宁 初级 · #2 ·
同求,期待更新
张军
张军 初级 · #1 ·
同求,期待更新
1 2
微信客服 微信客服 QQ官方交流群 QQ官方交流群