Счетчик кликов/переходов по ссылке
Все релизы DLE я выкладываю папкой в облаке на mail.ru, но что то решил переделать обычный вид ссылки, которую я выводил в цитате, решил оформить в в виде всех остальных прикрепленных файлов через attachment. Погуглив я нашёл решение от Sander ещё от 2013 года, но в 2020 он обновил скрипт, для сохранения всех данных в БД. В общем всё работает в его коде отлично, но мне нужно было вынести сам счетчик за пределы самой ссылки, т.е. чтобы ссылка - ссылкой, а в другом месте - количество переходов. Но поскольку я не кодер, какие то небольшие правки могу сделать сам, но не всегда получается - я обратился к ИИ. В общем вот что получилось.
PHP код engine/mods/click_counter.php:
<?php
@error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE);
@ini_set('error_reporting', E_ALL ^ E_WARNING ^ E_NOTICE);
@ini_set('display_errors', true);
@ini_set('html_errors', false);
define('DATALIFEENGINE', true);
define('ROOT_DIR', dirname(__DIR__));
define('ENGINE_DIR', ROOT_DIR . '/engine');
@include (ENGINE_DIR . '/data/config.php');
date_default_timezone_set($config['date_adjust']);
mb_internal_encoding($config['charset']);
require_once ENGINE_DIR . '/classes/mysql.php';
require_once ENGINE_DIR . '/data/dbconfig.php';
require_once ENGINE_DIR . '/modules/functions.php';
include_once ROOT_DIR . '/language/Russian/website.lng';
$href = trim((string)$_GET['href']);
if ($href == '') die('Undefinded href');
$hash = md5($href);
$row = $db->super_query("SELECT id, clicks FROM click_counter WHERE hash = '$hash'");
if ($_GET['type'] == 'set') {
if ($row['id']) {
$row['clicks']++;
$db->query("UPDATE click_counter SET clicks = clicks + 1 WHERE id = {$row['id']}");
} else {
$row['clicks'] = 1;
$db->query("INSERT INTO click_counter (hash) VALUES ('$hash')");
}
}
echo (int)$row['clicks'];
Или скачайте плагин:
Код JS, вставить перед </body>:
< script >
// Mini Counter for DLE (click_counter.php)
document.addEventListener('DOMContentLoaded', () => {
const root = window.dle_root || '/';
document.querySelectorAll('.attach').forEach(block => {
const link = block.querySelector('.download-link'),
counter = block.querySelector('.click_counter1');
if (!link || !counter || !link.href || link.href === '#') return;
const updateCounter = async (type) => {
try {
const url = `${root}engine/mods/click_counter.php?type=${type}&href=${encodeURIComponent(link.href)}`,
response = await fetch(url),
count = await response.text();
counter.textContent = /^\d+$/.test(count) ? `${count}` : '(Ошибка)';
} catch (e) {
counter.textContent = '(Ошибка)';
}
};
updateCounter('get'); // Загружаем текущее значение
link.addEventListener('click', (e) => {
e.preventDefault();
updateCounter('set');
setTimeout(() => window.open(link.href, '_blank'), 200);
});
});
}); < /script>
В шаблоне используем так: на саму ссылку добавляем класс
class="download-link"
Счетчик переходов по ссылке выводится:
<span class='click_counter1' title='Количество кликов'>0</span>
И всё это должно быть обёрнуто в класс "attach", пример кода, как выводится у меня:
<div class="attach clr clearfix ignore-select">
<a href="[xfvalue_links]" class="download-link" target="_blank" rel="noopener noreferrer">
<i class="fa fa-download"></i> Скачать {title}
</a>
<span class="attach-info"> <i class="fa fa-download"></i> Скачиваний: <span class='click_counter1' title='Количество кликов'>0</span> / <span class="fa fa-eye"></span> Просмотров: {views}</span>
</div>
Наглядный пример как это выглядит в итоге - в материале "DataLife Engine v.18.0 Final Release". Учитываются только уникальные нажатия по ссылке.