Так вот... На сегодня наша главная функция - statistics_exit модуля Statistics, с ней и будем работать. Но для начала несколько рекомендаций. Для того, чтобы заработал стандартный друпаловский функционал, который будет считать посещения стрениц необходимо сделать следующее:
- 1) Administer -> Site Building -> Modules. Тут включаем модуль Statistics, если он ещё не включен.
- 2) Administer -> Logs -> Access log settings. Включаем Enable access log и Count content views. Для большей уверенности ставим Discard access logs older than 1 day.
После всех этих действий открываем нашу функцию и пишем в неё следующий код:
<?php
if (variable_get('statistics_count_content_views', 0)) {
// We are counting content views.
if ((arg(0) == 'node') && is_numeric(arg(1)) && arg(2) == '') {
// A node has been viewed, so update the node's counters.
// Загружаем саму ноду, чтобы узнать её автора и исключить его из списка уникальных пользователей, ибо незачем нам самим накручивать
$node = node_load(arg(1));
// Задаем флаг на прибавление к счетчику в FALSE.
$add_count = FALSE;
// Устанавливаем промежуток времени, по прошествии которого мы будем накручивать счетчик
$once_per = 60 * 60 * 24; // 1 day
// Берем инфу из базы (нам собственно только нужно взять время последнего просмотра страницы текущего пользователя с его хостом)
$result = db_query("SELECT * FROM {accesslog} WHERE path = '%s' AND uid = %d AND hostname = '%s' AND uid != %d ORDER BY timestamp DESC LIMIT 0, 1", $_GET['q'], $user->uid, $_SERVER['REMOTE_ADDR'], $node->uid);
// взяли
if ($access = db_fetch_array($result)) {
// если чел уже смотрел эту страницу - смотрим когда он её смотрел
if (time() - $access['timestamp'] > $once_per)
// если больше, чем сутки назад - будем накручивать счетчик, если нет, то он и так уже FALSE
$add_count = TRUE;
}
else
// если чел не смотрел эту страницу вообще, или крон удалил запись старше 1 дня, то естессно это посещение надо засчитать, как же иначе (исключаем автора страницы)
if ($node->uid != $user->uid) $add_count = TRUE;
// ну а дальше стандартный друпаловский код с нашей проверкой
if ($add_count) {
db_query('UPDATE {node_counter} SET daycount = daycount + 1, totalcount = totalcount + 1, timestamp = %d WHERE nid = %d', time(), arg(1));
// If we affected 0 rows, this is the first time viewing the node.
if (!db_affected_rows()) {
// We must create a new row to store counters for the new node.
db_query('INSERT INTO {node_counter} (nid, daycount, totalcount, timestamp) VALUES (%d, 1, 1, %d)', arg(1), time());
}
}
}
}
?>
Вот собственно и все. Стоит только отметить, что здесь берется время именно последнего посещения страницы, т.е. если чел зашел на страницу первый раз и в течение суток жал на F5, то ровно через сутки его миллион первое посещение засчитано не будет, т.к. он же недавно эту страницу посмотрел... Обходится это довольно-таки просто. Заводится ещё одна таблица, где мы храним время первого захода на страницу и тогда через сутки после первого посещения мы засчитаем ещё одно и на уже не важно будет сколько раз в течение суток чел нажал F5. Но это уже совсем другая история...
TODO: А зачем все это надо? - спросит дотошный читатель. А вот зачем. На сайте есть некое подобие очков (поинтов, бонусов, без разницы). Надо сделать так, чтобы за каждую тысячу (1000) уникальных посещений страницы автору страницы начислялась определенная сумма очков, которая как вы правильно поняли тоже должна быть редактируемой для каждого пользователя в отдельности. Ключевое слово здесь было "уникальных". Идеи?
Комментарии
звените наверно тупой вопрос но у вас написано:
"После всех этих действий открываем нашу функцию и пишем в неё следующий код"
какую функцию ? где её искать ? что ето ?