您在這裡

計算node的人氣?

hanamizuki's 的頭像
hanamizuki 在 2008-10-25 (週六) 10:14 發表

嗨!找了很久,也許是方向錯誤,都找不到我需要的模組。

我的需求是,我有一種內容類型(usernode),想要讓這些類型依照人氣來做排行,並且希望能夠只抓取最近七天的人氣。
因為有些node比較晚出現,所以如果是計算總人氣,會比較不準,我是希望做個「近七天熱門node」排行,
計算方式是抓這種內容類型的近七天人氣。

我要弄的內容類型是usernode,也就是說我排的東西其實是使用者。
依照這個使用者usernode被觀看的次數來排。
還會想結合userpoint來做綜合計算。-->這應該更進階

PS. Views可以抓node的Recent Hits,但不知Recent Hits是指什麼?
且不知準不準,我怕用戶一直reload,hits就變多,這樣就不公正了。

啟用 Statistics 模組
到 管理 => 日誌 => 日誌記錄設定 頁面

日誌記錄設定
啟用日誌記錄:啟用
頁面瀏覽記錄保留:改為一週

內容瀏覽計數器設定
計算內容瀏覽次數:啟用

在 admin/logs/pages 就會有 過去 1 週 的熱門文章
不過一般的頁面也會被列進去 不限文章 也沒辦法設定內容類型

下面是該頁面的原始碼

<?php
function statistics_top_pages() {
$sql = "SELECT COUNT(path) AS hits, path, title, AVG(timer) AS average_time, SUM(timer) AS total_time FROM {accesslog} GROUP BY path, title";
$sql_cnt = "SELECT COUNT(DISTINCT(path)) FROM {accesslog}";

$header = array(
array('data' => t('Hits'), 'field' => 'hits', 'sort' => 'desc'),
array('data' => t('Page'), 'field' => 'path'),
array('data' => t('Average page generation time'), 'field' => 'average_time'),
array('data' => t('Total page generation time'), 'field' => 'total_time')
);
$sql .= tablesort_sql($header);
$result = pager_query($sql, 30, 0, $sql_cnt);

while ($page = db_fetch_object($result)) {
$rows[] = array($page->hits, _statistics_format_item($page->title, $page->path), t('%time ms', array('%time' => round($page->average_time))), format_interval(round($page->total_time / 1000)));
}

drupal_set_title(t('Top pages in the past %interval', array('%interval' => format_interval(variable_get('statistics_flush_accesslog_timer', 259200)))));
$output = theme('table', $header, $rows);
$output .= theme('pager', NULL, 30, 0);
return $output;
}
?>

仿照此頁面的程式另外寫一個頁面
修改一下 SQL 語法只撈出特定 path 的紀錄應該就可以了

$sql = "SELECT COUNT(path) AS hits, path, title, AVG(timer) AS average_time, SUM(timer) AS total_time FROM {accesslog} WHERE path like 'node/%' GROUP BY path, title";


$sql_cnt = "SELECT COUNT(DISTINCT(path)) FROM {accesslog} WHERE path like 'node/%'";

這部分最好再搭配 path & path_auto 模組
針對想要撈出的內容類型設定別名 例如 node/1 改成 page/1
然後 SQL 的條件改成 path like 'page/%' 就可以只抓出 page/ 開頭的路徑的點擊紀錄了

Recent Hits 是 node_counter 資料表內的 daycount 欄位
啟用 Statistics 模組之後 每點擊一次 node
node_counter 內的 daycount 欄位就會加 1
不過測試的結果 重新整理的時候也是會照樣加 1

執行 cron 的時候會把前一天的 daycount 歸零
這部分應該是不符合你的需求