discuz3.5如何去定时清零某一个积分 New
比如按月清理,每月都清零积分我知道答案 回答被采纳将会获得1 贡献 已有1人回答 欢迎使用插件
积分定期重置清零
https://addon.dismall.com/plugins/k_creditclear.html
如果需要多个不同任务组不同清零时间设置,那就用多任务版,如果只是简单某几个用户组统一清零,那就基础版本即可 在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]