Погуляв по интернету, нашел много плагинов для решения этой задачи, но все они были слишком навороченными для простого вывода счетчика. В итоге решил самостоятельно написать плагин для WordPress, который бы удовлетворял моей простой прихоти: вывода количества скачиваний файла рядом со ссылкой.
Для того, чтобы было понято, что мы будем делать, давайте определимся с тем, что должно получиться:
Допустим, у нас есть ссылка вида:
<a href="/upload/count_download.zip" title="Счетчик скачиваний">Cчетчик скачиваний для WordPress своими руками </a>
Нам надо в результате установки плагина, преобразовать эту ссылку и вывести счетчик скачиваний, рядом с ней. В итоге получим вот такую ссылку со счетчиком:
<noindex><a rel='nofollow' href='/download_count.php?url=upload/catalog.zip' title='Счетчик скачиваний'>Счетчик скачиваний для WordPress своими руками</a></noindex> <strong>(Файл скачали: 5 человек)</strong>
Cуть работы плагина:
Исходную ссылку мы оформляем в соответствии с требованием плагина т.е. если у нас было:
<a href="/upload/countdownload.zip" title="Счетчик скачиваний">Cчетчик скачиваний для WordPress своими руками</a>
то с помощью панели администратора, в форме редактирования страниц, вводим шорткод следующего вида:
[download_file url="upload/countdownload.zip" title="Счетчик скачиваний"]
счетчик скачиваний для WordPress своими руками
[/download_file]
Плагин обрабатывает данный шорткод и заменяет его более понятной формой для браузеров, дописывая количество скачавших человек рядом с ссылкой.
С принципом работы плагина вроде все понятно, кроме того как ведется подсчет скачиваний. Сейчас я и об этом расскажу.
При нажатии на преобразованную ссылку, как видите мы попадаем на скрипт /download_count.php, который отдает пользователю запрашиваемый файл, предварительно обновляя счетчик скачиваний в базе данных соответствующий этому файлу.
Все ясно? Правильно не все! Что за скрипт такой download_count.php и откуда он в корневой дирректории сайта?
Все дело в том, что скрипт счетчика скачиваний, не должен находиться в папке с файлами плагина, т.к. тогда и в ссылке придется указывать весь путь до него, а это не есть гуд. Поэтому, плагин принудительно создает этот скрипт в корневой директории, каждый раз когда при обработке шорткода не обнаруживает наличие download_count.php.
Заметьте, что если download_count.php был создан один раз, и не удалялся до следующего обращения к нему, то плагин не будет его создавать каждый раз.
С теорией разобрались, перейдем к написанию кода:
При активации плагина счетчика в админке WordPress, сразу создаем таблицу в базе в которую будем сохранять данные.
function install_download_file() { //при активации плагина создаем необходимую таблицу
global $wpdb;
$wpdb->query('CREATE TABLE IF NOT EXISTS `download_file` (
`url` varchar(254) NOT NULL,
`count` int(9) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;');
}
register_activation_hook(__FILE__,'install_download_file');
Далее пишем функцию, которая будет заменять шорткод на нужную ссылку
function count_download_file ($atts, $content = null) //Выводим счетчик скачиваний, рядом с ссылкой
{
// считываем данные из таблицы плагина о количестве скачиваний данного файла
global $wpdb;
$result = $wpdb->get_results("SELECT * FROM `download_file` WHERE `url` LIKE '".$atts["url"]."'", ARRAY_A);
if(!isset($atts["title"]))$atts["title"]=$content;
if($result[0]['url']) //если в таблицы существует информация о количестве нажатий, то выводим ее
return "<p><noindex> <a rel='nofollow' title='".$atts["title"]."' href='/download_count.php?url=".$atts["url"]."'>".$content."</a></noindex> <span style='font-style: italic; font-size:7pt;'>( Скачали: ".$result[0]['count']." чел. )</span> </p>";
else{ // если ссылка только появилась, то заносим ее в базу, и присваиваем количество нажатий = 0
$wpdb->query("INSERT INTO download_file VALUES ('".$atts["url"]."', '0')");
return "<p><noindex> <a rel='nofollow' title='".$atts["title"]."' href='/download_count.php?url=".$atts["url"]."'>".$content."</a></noindex> <span style='font-style: italic; font-size:7pt;'>( Скачали: 0 чел. )</span> </p>";
}
}
И вешаем ее в качестве обрабатывающей функции на шорткод download_file.
add_shortcode('download_file', 'count_download_file');
Вот и написали плагин счетчика скачиваний для WordPress…
Стоп, а где в коде происходит генерация файла download_count.php? Чуть не забыл важный момент.
Добавим следующий код в начало функции function count_download_file
if (!file_exists("download_count.php")){
$text='<?
if($_SERVER["HTTP_REFERER"]){
define("DB_NAME", "'.DB_NAME.'");
define("DB_USER", "'.DB_USER.'");
define("DB_PASSWORD", "'.DB_PASSWORD.'");
define("DB_HOST", "'.DB_HOST.'");
$connect = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
mysql_select_db(DB_NAME, $connect);
if(mysql_query("UPDATE download_file SET count=(count + 1) WHERE url=\'{$_GET["url"]}\'")){
header("Content-Length: " . filesize($_GET["url"]));
header("Content-type: application/octed-stream");
header("Content-Disposition: attachment; filename=".basename($_GET["url"]));
readfile($_GET["url"]);
}
else echo "К сожалению файл удален. Вернуться <a href=".$_SERVER["HTTP_REFERER"].">назад</a>.";
}
else echo "Пожалуйста не открывайте этот фаил напрямую, у него другие функции.";
?>';
$fp = fopen ("download_count.php", "w");
fwrite($fp,$text);
fclose($fp);
}
После активации плагина, и обновлении в браузере страницы с шорткодом, в корне сайта появится скрипт download_count.php.
Можете посмотреть на его код, прошу сильно не кидайте помидорами, т.к. не нашел более рационального способа обратиться к базе данных без танцев с бубном. Дело в том, что при подключении конфигурационного файла wp-config.php кроме определения директив выводятся еще и заголовки, что не сочетается с корректной работой плагина.
В общем и целом получился легковесный плагин: Cчетчик скачиваний для WordPress, для использования которого нужно лишь активировать его, и правильно составить шорткод. Инструкция по составлению шорткода находится прям в описании плагина.
Спасибо за внимание, пишите комменты.