Daily Views 1.1


Хак позволит вывести самые популярные по просмотрам новости за прошедший день, неделю, месяц и т.д. Для вывода используется стандартный тег custom с дополнительными параметрами.


Установка:
1. Выполнить базу данных MySQL запрос:
CREATE TABLE IF NOT EXISTS `dle_views_daily` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `news_id` int(11) NOT NULL DEFAULT '0',
  `date` date DEFAULT NULL,
  `views` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `news_id` (`news_id`,`date`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1;

2. Открыть engine/modules/functions.php и найти:
		if ($match[1] == "rand" ) { $fixed = ""; $news_msort = ""; } else $news_msort = "DESC";
		if ($match[1] == "title" ) $news_msort = "ASC";
	}

Добавить ниже:
#****** Daily View *** by MSW ******#
	if( preg_match( "#days_views=['\"](.+?)['\"]#i", $param_str, $match ) ) {
		$sql_select .= " LEFT JOIN " . PREFIX . "_views_daily v ON (p.id=v.news_id)";
		$views_day = date( "Y-m-d", $_TIME );
		$days = intval(trim($match[1]));
		if($days==15) {
			$day_s = date("Y-m-d", strtotime( "last Monday" )-60*60*24*6 );
			$day_e = date("Y-m-d", strtotime( "last Sunday" ) );
			$where[] = "v.date >= '{$day_s}' AND v.date <= '{$day_e}' DAY GROUP BY v.news_id";
		} elseif($days==16) {
			if(date("N")==1) $day_s = $views_day;
			else $day_s = date("Y-m-d", strtotime( "last Monday" ) );
			$where[] = "v.date >= '{$day_s}' GROUP BY v.news_id";
		} else {
//			$where[] = "v.date >= '{$views_day}' - INTERVAL {$days} DAY GROUP BY v.news_id";
			$where[] = "v.date = '{$views_day}' - INTERVAL {$days} DAY GROUP BY v.news_id";
		}
		$news_sort = "SUM(v.views)";
	}
#****** Daily View *** by MSW ******#

Найти далее:
$where[] = "date

Заменить на:
$where[] = "p.date

Найти далее:
'date' => 'date'

Заменить на:
'date' => 'p.date'

3. Открыть engine/modules/show.full.php и найти:
else $db->query( "UPDATE " . PREFIX . "_post_extras SET news_read=news_read+1 where news_id='{$row['id']}'" );

Добавить ниже:
#****** Daily View *** by MSW ******#
			$views_day = date( "Y-m-d", $_TIME );
			$db->query( "INSERT INTO " . PREFIX . "_views_daily (news_id, date, views) VALUES ('{$row['id']}', '{$views_day}', '1') ON DUPLICATE KEY UPDATE views=views+1;");
#****** Daily View *** by MSW ******#

4. Открыть cron.php и найти:
		} elseif($cronmode == "antivirus") {

Добавить выше:
#****** Daily View *** by MSW ******#
		} elseif($cronmode == "daily_views") {
			$_TIME = time () + ($config['date_adjust'] * 60);
			$views_day = date( "Y-m-d", $_TIME );
			$db->query("DELETE FROM " . PREFIX . "_views_daily WHERE `date` < '{$views_day}' - INTERVAL 14 DAY");
			die("done");
#****** Daily View *** by MSW ******#

5. Поставить на крон запрос раз в день:
/cron.php?cronmode=daily_views

или
php -f cron.php daily_views

Готово!

Теперь можно использовать стандартный тег {custom} с дополнительными параметрами:
days_views=ХХХ - выведет новости по просмотрам за день смещённый на указанное число от текущей даты, напрмиер 0 - только текущий день, 1 - только за вчера, 2 только за позавчера и т.д.
days_views=15  - за прошедшую неделю
days_views=16  - за текущую неделю

Модификация от DarkLane:
daily-views-1_1-dle-13_3-15_1.zip
Создайте аккаунт или авторизуйтесь для скачивания
 
Версия DLE: 9.6-10.3, 13.3-15.1
Кодировка: utf-8
Автор: MSW

Примечание от Oxigen: Добавлена модификация от DarkLane

Информация
Посетители, находящиеся в группе Гость, не могут оставлять комментарии к данной публикации.

Комментариев 1

TalkingFOX 1 августа 2021 19:17
На DLE 14.3 работает, с небольшими правками.
2) Добавить выше:
if( preg_match( "#fixed=['\"](.+?)['\"]#i", $param_str, $match ) ) {