Счётчик уникальных просмотров постов

MB
На сайте с 24.02.2009
Offline
162
734

Всем привет.

Есть такая функция для WP которая считает просмотры постов и записывает их в БД, проблема в том что эта функция считает все просмотры и не уникальные тоже, как сделать чтобы считались только уникальные просмотры?

Постов на сайте много, установка куки, вряд ли правильный вариант.

Вот сам код:

<?php

function views_check_id($id){
global $wpdb;
$tb_name = "count_views";
$table_name = $wpdb->prefix.$tb_name;
$row = $wpdb->get_row($wpdb->prepare('SELECT id FROM '.$table_name.' WHERE item = %d',$id));
if($row->id != "")
return true;
else return false;
}
function views_insert_qb($id){
global $wpdb;
$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'));
}}
function views_count(){
global $wpdb;
$tb_name = "count_views";
$table_name = $wpdb->prefix.$tb_name;
global $wp_query; $postid = $wp_query->post->ID;
views_insert_qb($postid);
$row = $wpdb->get_row($wpdb->prepare('SELECT value FROM '.$table_name.' WHERE item = '.$postid.''));
return $row->value;
}
totamon
На сайте с 12.05.2007
Offline
437
#1
Mister_Black:
как сделать чтобы считались только уникальные просмотры?

для начала определитесь что для вас "уникальные посты", потом добавьте в код условия этих "уникальных постов", в общем все просто...

Домены и хостинг https://8fn.ru/regru | Дедик от 3000р https://8fn.ru/73 | VPS в Москве https://8fn.ru/72 | Лучшие ВПС, ТП огонь, все страны! https://8fn.ru/inferno | ХОСТИНГ №1 РОССИИ https://8fn.ru/beget
MB
На сайте с 24.02.2009
Offline
162
#2

Пока добавил вот такую конструкцию

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 раздувается. Ещё надо добавить условие чтобы по юзерагенту ботов отсекать.

MB
На сайте с 24.02.2009
Offline
162
#3

Вот такой в итоге получился код, ботов отсекает, просроченные _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'));
}}}

Гляньте, может где то надо код подправить?

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий