includes/dashboard/referrers.php

<?php
declare(strict_types=1);

/*
|--------------------------------------------------------------------------
| Referrers and search engines
|--------------------------------------------------------------------------
*/

$referrersRaw = fetchAll($db, "
    SELECT referrer, SUM(views) AS views
    FROM referrers_daily
    WHERE $rangeSql
    GROUP BY referrer
    ORDER BY views DESC
", $rangeParams);

if ($includeArchives) {
    foreach (archiveGroupedViews('referrers', 'referrer', $rangeStart, $rangeEnd) as $row) {
        $referrersRaw[] = $row;
    }
}

$searchEnginesGrouped = [];
$referrersGrouped = [];

foreach ($referrersRaw as $row) {
    $referrer = (string)($row['referrer'] ?? '');

    if ($referrer === '') {
        continue;
    }

    $realCategory = referrerCategory($referrer);

    if (
        referrerBlocked($referrer) ||
        $realCategory === BRIVACIA_CATEGORY_BLOCKED
    ) {
        $canonical = BRIVACIA_BLOCKED;
        $label = t('ui.blocked');
        $category = BRIVACIA_CATEGORY_BLOCKED;
    } elseif (strcasecmp($referrer, BRIVACIA_UNKNOWN) === 0) {
        $canonical = BRIVACIA_UNKNOWN;
        $label = t('ui.unknown');
        $category = BRIVACIA_CATEGORY_REFERRER;
    } else {
        $canonical = referrerCanonical($referrer);
        $label = referrerLabel($referrer);
        $category = $realCategory;
    }

    if ($category === BRIVACIA_CATEGORY_SEARCH) {
        $target =& $searchEnginesGrouped;
    } else {
        $target =& $referrersGrouped;
    }

    if (!isset($target[$canonical])) {
        $target[$canonical] = [
            'referrer' => $canonical,
            'label' => $label,
            'category' => $category,
            'views' => 0,
        ];
    }

    $target[$canonical]['views'] += (int)($row['views'] ?? 0);

    unset($target);
}

$searchEngines = array_values($searchEnginesGrouped);
$referrers = array_values($referrersGrouped);

usort($searchEngines, fn($a, $b) => $b['views'] <=> $a['views']);
usort($referrers, fn($a, $b) => $b['views'] <=> $a['views']);