Cố gắng tránh các crons bất cứ khi nào có thể, nhưng dựa trên câu trả lời từ @Farahmand, tôi đã đặt một biến thể của mã này trong một onUserLogout()
sự kiện Plugin người dùng :
Khi bất kỳ người dùng nào đăng xuất , plugin sẽ đăng ký bất kỳ nội dung nào của họ , cũng như bất kỳ kiểm tra nào khác có thể đã bị bỏ qua. Tôi chỉ muốn một số nhóm người dùng nhất định bị ảnh hưởng và để đảm bảo rằng bất kỳ nội dung người dùng quản trị viên nào cũng không bao giờ bị ảnh hưởng (vì lý do nội bộ của chúng tôi - có thể quá mức cho các cài đặt thông thường, nhưng trong trường hợp của chúng tôi, chúng tôi có các nhóm người dùng tùy chỉnh có thể ở một số nhóm người dùng chuẩn, do đó đã chiếm sự chồng chéo đó).
function onUserLogout() {
$groups_include = '2,4,10'; // Affect Registered, Publishers, and Custom Group
$groups_exclude = '7,8'; // Don't affect Administrators or Super Users
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->update($db->quoteName('#__content'))
->set('checked_out = 0, checked_out_time = 0')
->where('( checked_out = '.JFactory::getUser()->id.' ) OR (
checked_out_time < NOW() - INTERVAL 12 HOUR
AND checked_out IN (SELECT GROUP_CONCAT(user_id) FROM scm_user_usergroup_map WHERE group_id IN ('.$groups_include.'))
AND checked_out NOT IN (SELECT GROUP_CONCAT(user_id) FROM scm_user_usergroup_map WHERE group_id IN ('.$groups_exclude.'))
)'
);
$db->setQuery($query);
$db->execute();
return true;
}
Tôi chắc chắn rằng SQL có thể được điều chỉnh cho Timezones, v.v., nhưng đây là câu lệnh SQL kết quả:
UPDATE `gdp_content`
SET checked_out = 0, checked_out_time = 0
WHERE ( checked_out = 30 ) OR (
checked_out_time < NOW() - INTERVAL 12 HOUR
AND checked_out IN (SELECT GROUP_CONCAT(user_id) FROM scm_user_usergroup_map WHERE group_id IN (2,10,11))
AND checked_out NOT IN (SELECT GROUP_CONCAT(user_id) FROM scm_user_usergroup_map WHERE group_id IN (7,8))
)