- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Что делать, если ваша email-рассылка попала в спам
10 распространенных причин и решений
Екатерина Ткаченко
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Всем привет.
Есть такая функция для WP которая считает просмотры постов и записывает их в БД, проблема в том что эта функция считает все просмотры и не уникальные тоже, как сделать чтобы считались только уникальные просмотры?
Постов на сайте много, установка куки, вряд ли правильный вариант.
Вот сам код:
как сделать чтобы считались только уникальные просмотры?
для начала определитесь что для вас "уникальные посты", потом добавьте в код условия этих "уникальных постов", в общем все просто...
Пока добавил вот такую конструкцию
function views_insert_qb($id){global $wpdb;
$user_ip = $_SERVER['REMOTE_ADDR'];
$key = $user_ip . 'x' . $id;
$value = array($user_ip, $id);
$visited = get_transient($key);
if ( false === ( $visited ) ) {
set_transient( $key, $value, 60*60*12 );
$tb_name = "count_views";
$table_name = $wpdb->prefix.$tb_name;
if(views_check_id($id)){
$views = $wpdb->get_row($wpdb->prepare('SELECT value FROM '.$table_name.' WHERE item = '.$id.''));
$view = $views->value;
$wpdb->update($table_name, array('value' => $view + 1), array('item' => $id ));
}else{
$wpdb->insert($table_name, array('item' => $id, 'value' => '1'), array('%d', '%d'));
}}}
Но тут возникла другая проблема _transient_timeout_ почему то не удаляется даже после истечения срока давности, соответственно таблица wp_options раздувается. Ещё надо добавить условие чтобы по юзерагенту ботов отсекать.
Вот такой в итоге получился код, ботов отсекает, просроченные _transient_ по крону удаляю раз в час
function views_insert_qb($id){global $wpdb;
$exclude_bots = 1;
if( $exclude_bots==1 && $id ){
$useragent = $_SERVER['HTTP_USER_AGENT'];
$notbot = "Mozilla|Opera";
$bot = "Bot/|robot|Slurp/|yahoo";
if ( !preg_match("/$notbot/i", $useragent) || preg_match("!$bot!i", $useragent) )
return false;}
$user_ip = $_SERVER['REMOTE_ADDR'];
$key = $user_ip . 'x' . $id;
$value = array($user_ip, $id);
$visited = get_transient($key);
if ( false === ( $visited ) ) {
set_transient( $key, $value, 60*60*12 );
$tb_name = "count_views";
$table_name = $wpdb->prefix.$tb_name;
if(views_check_id($id)){
$views = $wpdb->get_row($wpdb->prepare('SELECT value FROM '.$table_name.' WHERE item = '.$id.''));
$view = $views->value;
$wpdb->update($table_name, array('value' => $view + 1), array('item' => $id ));
}else{
$wpdb->insert($table_name, array('item' => $id, 'value' => '1'), array('%d', '%d'));
}}}
Гляньте, может где то надо код подправить?