удаление не активных пользователей и старых сообщений пользователей.
удаление не активных пользователей
и
старых сообщений пользователей
Через крон для второй ветки , но к сожалению ничего путного не нашел. Очень много соц. шаблонов и шаблонов знакомств.
Вот теоретически ты создаешь сайт знакомства и через год у тебя 50 % мертвых аккаунтов и не нужной переписки, не в ручную же чистить ?
Возможно кто-то сталкивался с такой проблемой и нашел решения?
Тоже интересует такой вопрос, как удалить неактивных пользователей? Например, кто не заходил на сайт Х лет и у кого 0 сообщений.
Тоже интересует такой вопрос, как удалить неактивных пользователей? Например, кто не заходил на сайт Х лет и у кого 0 сообщений.
Тут нужно писать разработку. Я бы тоже поучаствовал.
1. В папке system/controllers/users/hooks создайте файл cron_delnausers.php с таким содержимым:
<?php class onUsersCronDelnausers extends cmsAction { public $disallow_event_db_register = true; public function run() { $users = $this->model->filterDateOlder('date_log', 365, 'DAY')->getUsers(); if ($users) { foreach ($users as $user) { $this->model->deleteUser($user['id']); } } return true; } }
365 — это количество дней, в течение которых пользователь не входил на сайт.
2. Панель управления -> Настройки -> Планировщик -> Создать задачу:
- Описание: Удаление неактивных пользователей
- Компонент: users
- Хук: delnausers
Должны удаляться все со всеми следами, кто не заходил на сайт установленное число дней. Перед использованием лучше проверить на копии сайта, а то мало ли что))
Нифигаccе о-го-гошеньки, огромное спасибо!!! А можете добавить ещё условия, что бы проверялось, что аккаунт пустой. Например, 0 комментариев или 0 типов контента. А то так может человек оставил много ценной информации(посты, комментарии) на сайте и он не заходил последний год, то как я понимаю это всё удалится.
условия, что бы проверялось, что аккаунт пустой. Например, 0 комментариев или 0 типов контента
<?php class onUsersCronDelnausers extends cmsAction { public $disallow_event_db_register = true; public function run() { $users = $this->model->filterDateOlder('date_log', 365, 'DAY')->getUsers(); if ($users) { foreach ($users as $user) { // проверяем, добавлял ли пользователь записи ТК $ct = $this->checkCtypes($user['id']); // если да, то не трогаем if ($ct) { continue; } // проверяем, добавлял ли пользователь комментарии $comments = $this->checkComments($user['id']); // если да, то не трогаем if ($comments) { continue; } // проверяем, является ли пользователь владельцем группы $groups = $this->checkGroups($user['id']); // если да, то не трогаем if ($groups) { continue; } $this->model->deleteUser($user['id']); } } return true; } public function checkCtypes($u_id){ $ctypes = $this->model_content->getContentTypes(); $ct = []; foreach ($ctypes as $ctype) { $items = $this->model->filterEqual('user_id', $u_id)->get('con_'.$ctype['name']); if ($items) { continue; } $ct = $ctype['name']; } return $ct; } public function checkComments($u_id) { $comments = $this->model->filterEqual('user_id', $u_id)->get('comments'); if ($comments) { return true; } return false; } public function checkGroups($u_id) { $groups = $this->model->filterEqual('owner_id', $u_id)->get('groups'); if ($groups) { return true; } return false; } }
Пересмотрел, немного не правильно. Вот этот кусок кода
public function checkCtypes($u_id){ $ctypes = $this->model_content->getContentTypes(); $ct = []; foreach ($ctypes as $ctype) { $items = $this->model->filterEqual('user_id', $u_id)->get('con_'.$ctype['name']); if ($items) { continue; } $ct = $ctype['name']; } return $ct; }
должен быть таким:
public function checkCtypes($u_id){ $ctypes = $this->model_content->getContentTypes(); foreach ($ctypes as $ctype) { $items = $this->model->filterEqual('user_id', $u_id)->get('con_'.$ctype['name']); if ($items) { return true; } } return false; }
Ну и конечно, всё надо тестировать на копии сайта, пишу наугад))
А еще можно добавить метку юзеру, которого не надо удалять, чтобы каждый раз не проверять. Для этого можно в БД в таблице юзеров добавить столбец с именем nocrondel или создать поле (в настройках закрыть все доступы — изменение, просмотр). И тогда код хука будет такой:
<?php class onUsersCronDelnausers extends cmsAction { public $disallow_event_db_register = true; public function run() { $users = $this->model->filterNotEqual('nocrondel', '1')->filterDateOlder('date_log', 365, 'DAY')->getUsers(); if ($users) { foreach ($users as $user) { // проверяем, добавлял ли пользователь записи ТК $ct = $this->checkCtypes($user['id']); // если да, то не трогаем if ($ct) { $this->nocrondel($user['id']); continue; } // проверяем, добавлял ли пользователь комментарии $comments = $this->checkComments($user['id']); // если да, то не трогаем if ($comments) { $this->nocrondel($user['id']); continue; } // проверяем, является ли пользователь владельцем группы $groups = $this->checkGroups($user['id']); // если да, то не трогаем if ($groups) { $this->nocrondel($user['id']); continue; } $this->model->deleteUser($user['id']); } } return true; } public function checkCtypes($u_id){ $ctypes = $this->model_content->getContentTypes(); foreach ($ctypes as $ctype) { $items = $this->model->filterEqual('user_id', $u_id)->get('con_'.$ctype['name']); if ($items) { return true; } } return false; } public function checkComments($u_id) { $comments = $this->model->filterEqual('user_id', $u_id)->get('comments'); if ($comments) { return true; } return false; } public function checkGroups($u_id) { $groups = $this->model->filterEqual('owner_id', $u_id)->get('groups'); if ($groups) { return true; } return false; } public function nocrondel($u_id) { $this->model->update('cms_users', $u_id, ['nocrondel' => 1]); return true; } }