CRON - задачи

удаление не активных пользователей и старых сообщений пользователей.

#1 17 октября 2016 в 11:37
Давно были такие вопросы, как :
удаление не активных пользователей
и
старых сообщений пользователей

Через крон для второй ветки , но к сожалению ничего путного не нашел. Очень много соц. шаблонов и шаблонов знакомств.

Вот теоретически ты создаешь сайт знакомства и через год у тебя 50 % мертвых аккаунтов и не нужной переписки, не в ручную же чистить ?

Возможно кто-то сталкивался с такой проблемой и нашел решения?
#2 27 февраля 2023 в 10:27

Тоже интересует такой вопрос, как удалить неактивных пользователей? Например, кто не заходил на сайт Х лет и у кого 0 сообщений.  

#3 27 февраля 2023 в 11:36

Тоже интересует такой вопрос, как удалить неактивных пользователей? Например, кто не заходил на сайт Х лет и у кого 0 сообщений.  

Гарри

Тут нужно писать разработку. Я бы тоже поучаствовал. 

#4 27 февраля 2023 в 12:36

1. В папке system/controllers/users/hooks создайте файл cron_delnausers.php с таким содержимым:

  1. <?php class onUsersCronDelnausers extends cmsAction {
  2.  
  3. public $disallow_event_db_register = true;
  4. public function run() {
  5. $users = $this->model->filterDateOlder('date_log', 365, 'DAY')->getUsers();
  6. if ($users) {
  7. foreach ($users as $user) {
  8. $this->model->deleteUser($user['id']);
  9. }
  10. }
  11. return true;
  12. }
  13.  
  14. }

365 — это количество дней, в течение которых пользователь не входил на сайт.

2. Панель управления -> Настройки -> Планировщик -> Создать задачу:

  • Описание: Удаление неактивных пользователей
  • Компонент: users
  • Хук: delnausers

Должны удаляться все со всеми следами, кто не заходил на сайт установленное число дней. Перед использованием лучше проверить на копии сайта, а то мало ли что))

#5 27 февраля 2023 в 13:37

 Нифигаccе о-го-гошеньки, огромное спасибо!!! А можете добавить ещё условия, что бы проверялось, что аккаунт пустой. Например, 0 комментариев или 0 типов контента. А то так может человек оставил много ценной информации(посты, комментарии) на сайте и он не заходил последний год, то как я понимаю это всё удалится.   

#6 28 февраля 2023 в 08:40

условия, что бы проверялось, что аккаунт пустой. Например, 0 комментариев или 0 типов контента 

  1. <?php class onUsersCronDelnausers extends cmsAction {
  2.  
  3. public $disallow_event_db_register = true;
  4. public function run() {
  5. $users = $this->model->filterDateOlder('date_log', 365, 'DAY')->getUsers();
  6. if ($users) {
  7. foreach ($users as $user) {
  8.  
  9. // проверяем, добавлял ли пользователь записи ТК
  10. $ct = $this->checkCtypes($user['id']);
  11. // если да, то не трогаем
  12. if ($ct) { continue; }
  13.  
  14. // проверяем, добавлял ли пользователь комментарии
  15. $comments = $this->checkComments($user['id']);
  16. // если да, то не трогаем
  17. if ($comments) { continue; }
  18.  
  19. // проверяем, является ли пользователь владельцем группы
  20. $groups = $this->checkGroups($user['id']);
  21. // если да, то не трогаем
  22. if ($groups) { continue; }
  23.  
  24. $this->model->deleteUser($user['id']);
  25. }
  26. }
  27. return true;
  28.  
  29. }
  30.  
  31. public function checkCtypes($u_id){
  32. $ctypes = $this->model_content->getContentTypes();
  33. $ct = [];
  34. foreach ($ctypes as $ctype) {
  35. $items = $this->model->filterEqual('user_id', $u_id)->get('con_'.$ctype['name']);
  36. if ($items) { continue; }
  37. $ct = $ctype['name'];
  38. }
  39.  
  40. return $ct;
  41. }
  42.  
  43. public function checkComments($u_id) {
  44. $comments = $this->model->filterEqual('user_id', $u_id)->get('comments');
  45. if ($comments) { return true; }
  46.  
  47. return false;
  48. }
  49.  
  50. public function checkGroups($u_id) {
  51. $groups = $this->model->filterEqual('owner_id', $u_id)->get('groups');
  52. if ($groups) { return true; }
  53.  
  54. return false;
  55. }
  56.  
  57. }
Добавлено спустя 5 часов

Пересмотрел, немного не правильно. Вот этот кусок кода

  1. public function checkCtypes($u_id){
  2. $ctypes = $this->model_content->getContentTypes();
  3. $ct = [];
  4. foreach ($ctypes as $ctype) {
  5. $items = $this->model->filterEqual('user_id', $u_id)->get('con_'.$ctype['name']);
  6. if ($items) { continue; }
  7. $ct = $ctype['name'];
  8. }
  9.  
  10. return $ct;
  11. }

должен быть таким:

  1. public function checkCtypes($u_id){
  2. $ctypes = $this->model_content->getContentTypes();
  3. foreach ($ctypes as $ctype) {
  4. $items = $this->model->filterEqual('user_id', $u_id)->get('con_'.$ctype['name']);
  5. if ($items) { return true; }
  6. }
  7.  
  8. return false;
  9. }

Ну и конечно, всё надо тестировать на копии сайта, пишу наугад))

Добавлено спустя 12 часов

А еще можно добавить метку юзеру, которого не надо удалять, чтобы каждый раз не проверять. Для этого можно в БД в таблице юзеров добавить столбец с именем nocrondel или создать поле (в настройках закрыть все доступы — изменение, просмотр). И тогда код хука будет такой:

  1. <?php class onUsersCronDelnausers extends cmsAction {
  2. public $disallow_event_db_register = true;
  3. public function run() {
  4. $users = $this->model->filterNotEqual('nocrondel', '1')->filterDateOlder('date_log', 365, 'DAY')->getUsers();
  5. if ($users) {
  6. foreach ($users as $user) {
  7. // проверяем, добавлял ли пользователь записи ТК
  8. $ct = $this->checkCtypes($user['id']);
  9. // если да, то не трогаем
  10. if ($ct) { $this->nocrondel($user['id']); continue; }
  11.  
  12. // проверяем, добавлял ли пользователь комментарии
  13. $comments = $this->checkComments($user['id']);
  14. // если да, то не трогаем
  15. if ($comments) { $this->nocrondel($user['id']); continue; }
  16.  
  17. // проверяем, является ли пользователь владельцем группы
  18. $groups = $this->checkGroups($user['id']);
  19. // если да, то не трогаем
  20. if ($groups) { $this->nocrondel($user['id']); continue; }
  21.  
  22. $this->model->deleteUser($user['id']);
  23. }
  24. }
  25. return true;
  26. }
  27.  
  28. public function checkCtypes($u_id){
  29. $ctypes = $this->model_content->getContentTypes();
  30. foreach ($ctypes as $ctype) {
  31. $items = $this->model->filterEqual('user_id', $u_id)->get('con_'.$ctype['name']);
  32. if ($items) { return true; }
  33. }
  34. return false;
  35. }
  36.  
  37. public function checkComments($u_id) {
  38. $comments = $this->model->filterEqual('user_id', $u_id)->get('comments');
  39. if ($comments) { return true; }
  40. return false;
  41. }
  42.  
  43. public function checkGroups($u_id) {
  44. $groups = $this->model->filterEqual('owner_id', $u_id)->get('groups');
  45. if ($groups) { return true; }
  46. return false;
  47. }
  48.  
  49. public function nocrondel($u_id) {
  50. $this->model->update('cms_users', $u_id, ['nocrondel' => 1]);
  51. return true;
  52. }
  53. }
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.