哥斯拉 发表于 2024-2-23 13:38:11

discuz3.5如何去定时清零某一个积分 New

比如按月清理,每月都清零积分

我知道答案 回答被采纳将会获得1 贡献 已有1人回答

独家记忆 发表于 2024-2-23 13:39:01

欢迎使用插件

积分定期重置清零
https://addon.dismall.com/plugins/k_creditclear.html

如果需要多个不同任务组不同清零时间设置,那就用多任务版,如果只是简单某几个用户组统一清零,那就基础版本即可

Discuz智能体 发表于 2025-3-12 01:33:46

在Discuz! X3.5中实现按月清零某个积分,可以通过以下两种专业方案实现:

一、使用系统计划任务(推荐方案)
1. 创建任务脚本
在/source/class/task/目录下新建task_clearextcredits.php:

<?php
if(!defined('IN_DISCUZ')) exit('Access Denied');

class task_clearextcredits {
    public function pre_clearextcredits() {} // 前置方法
    public function csc_clearextcredits() {} // 附加设置

    public function run() {
      global $_G;
      // 指定要清零的extcredits编号(示例为extcredits2)
      $extcredit = 2;
      
      // 批量清零处理
      $step = 500; // 每次处理500条避免超时
      $count = C::t('common_member')->count();
      for($start = 0; $start < $count; $start += $step) {
            $members = C::t('common_member')->range($start, $step);
            foreach($members as $uid => $member) {
                C::t('common_member')->update($uid, array("extcredits$extcredit" => 0));
            }
      }
      
      // 更新统计缓存
      updatecache('setting');
      $this->succeed = true;
    }
}
?>

2. 后台配置计划任务
- 进入管理后台 → 工具 → 计划任务
- 新建任务:
* 任务名称:月度积分清零
* 任务脚本:clearextcredits
* 执行周期:每月一次
* 执行时间:每月1日 00:00

二、数据库事件方案(需MySQL5.1+)
1. 创建定时事件
DELIMITER $$
CREATE EVENT reset_extcredits_event
ON SCHEDULE EVERY 1 MONTH
STARTS DATE_ADD(LAST_DAY(CURDATE()), INTERVAL 1 DAY)
DO
BEGIN
    UPDATE pre_common_member SET extcredits2 = 0 WHERE extcredits2 != 0;
END$$
DELIMITER ;

注意事项:
1. 修改extcredits编号时需同步修改脚本中的$extcredit变量值(extcredits1到extcredits8)
2. 大量用户站点建议增加分页处理逻辑,示例代码已包含分页机制
3. 执行前务必备份数据库
4. 事件方案需要MySQL的EVENT_SCHEDULER权限
5. 可结合的积分日志插件记录清零操作

进阶建议:
可开发定制插件实现以下增强功能:
1. 可视化选择要清零的积分类型
2. 清零前发送站内通知
3. 支持保留部分积分不清零
4. 操作日志记录功能

两种方案各有优势,计划任务方案更符合Discuz!标准开发规范,数据库事件方案执行效率更高。建议根据实际服务器环境选择实施方案。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: discuz3.5如何去定时清零某一个积分 New