Contador que filtre IP

  • Autor Autor liukin
  • Fecha de inicio Fecha de inicio
liukin

liukin

Dseda
Verificación en dos pasos activada
Verificado por Whatsapp
Uso este código ( junto a otro para mostrar el resultado) para un contador de visitas de cada posts de Wordpress.

PHP:
function setAndViewPostViews($postID) {
    $count_key = 'views';
    $count = get_post_meta($postID, $count_key, true);
    if($count==''){
        $count = 0;
        delete_post_meta($postID, $count_key);
        add_post_meta($postID, $count_key, '0');
    }else{
        $count++;
        update_post_meta($postID, $count_key, $count);
    }
    return $count;}

Funciona correctamente, pero me cuenta una visita cada vez que se refresca la página. Alguien puede orientarme del código que necesito para que haga lo mismo pero que me cuente solo una visita por IP.

He buscado info por la web pero no se me adaptan las variables y demás al código que tengo y estoy un poco hecho un lío. Si conocéis algún truco para al menos evitarme que alguien no abuse del contador con repetidos F5 también me valdría. Gracias por adelantado 😉
 
Última edición:
[MENTION=168322]liukin[/MENTION] buscando en google encontre varias formas las cuales es ir guardando las ip de los visitantes en un get_post_meta y luego
ir comparandolas con el visitante actual y si no existe actualizar los dos get_post_meta!!

tabien puedes agregarle una cookie!! :encouragement:
 
Última edición:
[MENTION=168322]liukin[/MENTION] buscando en google encontre varias formas las cuales es ir guardando las ip de los visitantes en un get_post_meta y luego
ir comparandolas con el visitante actual y si no existe actualizar los dos get_post_meta!!

tabien puedes agregarle una cookie!! :encouragement:
Hola te serviria algo como una consulta para saber si el ip ya esta guardado en la base de datos ejemplo

If (Mysqli_num_rows(consulta) == 0){registramos nuevo visitante}

Saludos
 
necesitas almacenar las ips de tus visitantes (en un archivo o en una bd), cuando quieras contar una visita, checa si esa ip no está en tu lista, si no está contabilizas la visita, de lo contrario la ignoras.
 
Gracias a todos por las respuestas.:encouragement:

Intentaré hacer lo que comentáis pero veo que se me va a complicar ya que al tratarse de un único contador(código en el functions.php de Wordpress) para que funcione en los distintos post creo que no va a funcionar. Si la IP existe en la BD quiero que no me cuente en un determinado post, pero en otro sí y al encontrarse ya en la lista lo ignoraría según lo entiendo.

Seguramente tenga que optar por un plugin específico, cosa que quería evitar.
 
Gracias a todos por las respuestas.:encouragement:

Intentaré hacer lo que comentáis pero veo que se me va a complicar ya que al tratarse de un único contador(código en el functions.php de Wordpress) para que funcione en los distintos post creo que no va a funcionar. Si la IP existe en la BD quiero que no me cuente en un determinado post, pero en otro sí y al encontrarse ya en la lista lo ignoraría según lo entiendo.

Seguramente tenga que optar por un plugin específico, cosa que quería evitar.
Hola.

Puedes crear una condicion para eso.

Por ejemplo el id del post y la ip. Que consigues con esto que el ip y el id del post se guarden en conjunto. Asi cuando esa misma ip visite otro post con id diferente se cuente como visita.

Saludos
 
Como te han comentado arriba, lo mejor seria guardar la ip de cada visitante en la base de datos y comprobar en cada visita si desde esa ip ya han ingresado en otra ocasión a tu pagina web y si no lo ha hecho procedes a contabilizar la visita, el único problema seria las ip's dinamicas de los visitantes, ya que si cambia la contabilizara obviamente :encouragement:
 
PHP:
function mi_ip() {
    $ipaddress = '';
    if (isset($_SERVER['HTTP_CLIENT_IP']))
        $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
    else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
        $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_X_FORWARDED']))
        $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
    else if(isset($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']))
        $ipaddress = $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
    else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
        $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_FORWARDED']))
        $ipaddress = $_SERVER['HTTP_FORWARDED'];
    else if(isset($_SERVER['REMOTE_ADDR']))
        $ipaddress = $_SERVER['REMOTE_ADDR'];
    else
        $ipaddress = 'UNKNOWN';
    return $ipaddress;
}


function setAndViewPostViews($postID) {
    $ip_actual = mi_ip();

    $count_key = 'views';
    $ips_key = 'ips_contador';
    $count = get_post_meta($postID, $count_key, true);
    $ips = unserialize(get_post_meta($postID, $ips_key, true));

    if(   $count===FALSE   ){
       /* AUN NO EXISTE EL CONTADOR, ASI QUE LO INICIAMOS CON UN 1, Y AGREGAMOS LA IP */
           $count = 1;
           $ips = array($ip_actual);

           update_post_meta($postID, $count_key, $count);
           update_post_meta($postID, $ip_key, serialize($ips));
    }else{
        /* ya existe el contador, por lo que minimo ya debe existir una IP almacenada, asi que revisamos */
        if(   $ips!==FALSE   ) {
           /* SI EXISTEN IPS ALMACENADAS, AHORA BUSCAMOS QUE LA IP ACTUAL NO EXISTA */
           if(   $array_search($ip_actual, $ips)!==FALSE   ) {
             $count++;
             array_push($ips, $ip_actual);

             update_post_meta($postID, $count_key, $count);
             update_post_meta($postID, $ip_key, serialize($ips));
           }
        } else {
             /* NO EXISTEN IPS ALMACENADAS, ASI QUE AUMENTAMOS EL CONTADOR Y AGREGAMOS LA IP */
             $count++;
             $ips = array($ip_actual);

             update_post_meta($postID, $count_key, $count);
             update_post_meta($postID, $ip_key, serialize($ips));
        }
    }
    return $count;
}

NO LO TESTIE!! PERO MAS O MENOS ASI DEBE DE FUNCIONAR
 
Última edición:
El problema es que vas a bombardear los recursos de tu web con guardar y comparar tantas IP (sobre todo si usas un campo personalizado para gardar, extraer y comparar, veo una bola de nieve traga recursos ahí). Como tengas muchas visitas de golpe o con el paso del tiempo, el sitio se pondrá lento y terminará cayéndose a cada momento.

Lo más sencillo es lo que te dijeron al principio de usar una cokkie, pero si quieres insistir en guardar todas las IP, mejor usa wpdb para alojar las IP en una tabla aparte en tu BD, para luego hacer la búsqueda de la IP de cadas visitante como una consulta SQL(sera mas óptimo).

kj
 
El problema es que vas a bombardear los recursos de tu web con guardar y comparar tantas IP (sobre todo si usas un campo personalizado para gardar, extraer y comparar, veo una bola de nieve traga recursos ahí). Como tengas muchas visitas de golpe o con el paso del tiempo, el sitio se pondrá lento y terminará cayéndose a cada momento.

Lo más sencillo es lo que te dijeron al principio de usar una cokkie, pero si quieres insistir en guardar todas las IP, mejor usa wpdb para alojar las IP en una tabla aparte en tu BD, para luego hacer la búsqueda de la IP de cadas visitante como una consulta SQL(sera mas óptimo).

kj

Exacto, eso me temo con el método de la IP al ser en varios post por separado. Como digo también me valdría algún tip para que el usuario no pudiera abusar del F5 o refrrescar la página y por lo que veo igual es mejor usar una cookie como comentas. Aún le estoy dando vueltas al problema antes de ponerme en manos de un experto en programación que me lo realize.

- - - Actualizado - - -

PHP:
function mi_ip() {
    $ipaddress = '';
    if (isset($_SERVER['HTTP_CLIENT_IP']))
        $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
    else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
        $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_X_FORWARDED']))
        $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
    else if(isset($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']))
        $ipaddress = $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
    else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
        $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_FORWARDED']))
        $ipaddress = $_SERVER['HTTP_FORWARDED'];
    else if(isset($_SERVER['REMOTE_ADDR']))
        $ipaddress = $_SERVER['REMOTE_ADDR'];
    else
        $ipaddress = 'UNKNOWN';
    return $ipaddress;
}


function setAndViewPostViews($postID) {
    $ip_actual = mi_ip();

    $count_key = 'views';
    $ips_key = 'ips_contador';
    $count = get_post_meta($postID, $count_key, true);
    $ips = unserialize(get_post_meta($postID, $ips_key, true));

    if(   $count===FALSE   ){
       /* AUN NO EXISTE EL CONTADOR, ASI QUE LO INICIAMOS CON UN 1, Y AGREGAMOS LA IP */
           $count = 1;
           $ips = array($ip_actual);

           update_post_meta($postID, $count_key, $count);
           update_post_meta($postID, $ip_key, serialize($ips));
    }else{
        /* ya existe el contador, por lo que minimo ya debe existir una IP almacenada, asi que revisamos */
        if(   $ips!==FALSE   ) {
           /* SI EXISTEN IPS ALMACENADAS, AHORA BUSCAMOS QUE LA IP ACTUAL NO EXISTA */
           if(   $array_search($ip_actual, $ips)!==FALSE   ) {
             $count++;
             array_push($ips, $ip_actual);

             update_post_meta($postID, $count_key, $count);
             update_post_meta($postID, $ip_key, serialize($ips));
           }
        } else {
             /* NO EXISTEN IPS ALMACENADAS, ASI QUE AUMENTAMOS EL CONTADOR Y AGREGAMOS LA IP */
             $count++;
             $ips = array($ip_actual);

             update_post_meta($postID, $count_key, $count);
             update_post_meta($postID, $ip_key, serialize($ips));
        }
    }
    return $count;
}

NO LO TESTIE!! PERO MAS O MENOS ASI DEBE DE FUNCIONAR

Gracias proTest :star2:

Le voy ha echar un ojo al código a ver si consigo adaptarlo a mi sitio.
 
PHP:
function mi_ip() {
    $ipaddress = '';
    if (isset($_SERVER['HTTP_CLIENT_IP']))
        $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
    else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
        $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_X_FORWARDED']))
        $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
    else if(isset($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']))
        $ipaddress = $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
    else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
        $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_FORWARDED']))
        $ipaddress = $_SERVER['HTTP_FORWARDED'];
    else if(isset($_SERVER['REMOTE_ADDR']))
        $ipaddress = $_SERVER['REMOTE_ADDR'];
    else
        $ipaddress = 'UNKNOWN';
    return $ipaddress;
}


function setAndViewPostViews($postID) {
    $ip_actual = mi_ip();

    $count_key = 'views';
    $ips_key = 'ips_contador';
    $count = get_post_meta($postID, $count_key, true);
    $ips = unserialize(get_post_meta($postID, $ips_key, true));

    if(   $count===FALSE   ){
       /* AUN NO EXISTE EL CONTADOR, ASI QUE LO INICIAMOS CON UN 1, Y AGREGAMOS LA IP */
           $count = 1;
           $ips = array($ip_actual);

           update_post_meta($postID, $count_key, $count);
           update_post_meta($postID, $ip_key, serialize($ips));
    }else{
        /* ya existe el contador, por lo que minimo ya debe existir una IP almacenada, asi que revisamos */
        if(   $ips!==FALSE   ) {
           /* SI EXISTEN IPS ALMACENADAS, AHORA BUSCAMOS QUE LA IP ACTUAL NO EXISTA */
           if(   $array_search($ip_actual, $ips)!==FALSE   ) {
             $count++;
             array_push($ips, $ip_actual);

             update_post_meta($postID, $count_key, $count);
             update_post_meta($postID, $ip_key, serialize($ips));
           }
        } else {
             /* NO EXISTEN IPS ALMACENADAS, ASI QUE AUMENTAMOS EL CONTADOR Y AGREGAMOS LA IP */
             $count++;
             $ips = array($ip_actual);

             update_post_meta($postID, $count_key, $count);
             update_post_meta($postID, $ip_key, serialize($ips));
        }
    }
    return $count;
}

NO LO TESTIE!! PERO MAS O MENOS ASI DEBE DE FUNCIONAR

Buen código!:encouragement:
 
lo mejor que puedes hacer es detectar las conexiones mediante el ip del usuario y hacer uso de esta guía para detectar si utiliza algún proxy
Detectar conexiones desde proxy y la IP real |

pero ojo hay que tener también en cuenta que algunos proxy garantiza total privacidad en la red.

El uso de cookie es un segundo plano de seguridad. Como también puedes integrar otros datos "user agent"
 
El problema es que vas a bombardear los recursos de tu web con guardar y comparar tantas IP (sobre todo si usas un campo personalizado para gardar, extraer y comparar, veo una bola de nieve traga recursos ahí). Como tengas muchas visitas de golpe o con el paso del tiempo, el sitio se pondrá lento y terminará cayéndose a cada momento.

Lo más sencillo es lo que te dijeron al principio de usar una cokkie, pero si quieres insistir en guardar todas las IP, mejor usa wpdb para alojar las IP en una tabla aparte en tu BD, para luego hacer la búsqueda de la IP de cadas visitante como una consulta SQL(sera mas óptimo).

kj

Exacto, eso me temo con el método de la IP al ser en varios post por separado. Como digo también me valdría algún tip para que el usuario no pudiera abusar del F5 o refrrescar la página y por lo que veo igual es mejor usar una cookie como comentas. Aún le estoy dando vueltas al problema antes de ponerme en manos de un experto en programación que me lo realize.

Si esa información la conservan "por los siglos, de los siglos", si, es probable que pase eso, pero, yo tuve una situación similar y la resolví de la siguiente manera. Necesitaba un contador que contara las visitas únicas (el cliente no quiso ninguno de los gratis del mercado, así que le tuve que hacer uno), para ello guardo la dirección ip del visitante en una tabla (base mysql), luego, cuando viene una visita borro todo lo que ya tenga más de 24 horas de existencia (la tabla aparte del campo ip tiene un campo para la fecha de esa visita), así todo lo que hay es siempre lo que se ha visitado en ese día y si su ip ya está en la lista, ya no se agrega y por lo tanto el contador no aumenta.

También al borrar todo lo que no sea del día no se hace una tabla gigantesca y hasta ahora no tengo el problema de que el acceso sea lento a la web por culpa de ese contado.
 
Exacto, eso me temo con el método de la IP al ser en varios post por separado. Como digo también me valdría algún tip para que el usuario no pudiera abusar del F5 o refrrescar la página y por lo que veo igual es mejor usar una cookie como comentas. Aún le estoy dando vueltas al problema antes de ponerme en manos de un experto en programación que me lo realize.

- - - Actualizado - - -



Gracias proTest :star2:

Le voy ha echar un ojo al código a ver si consigo adaptarlo a mi sitio.

Buen código!:encouragement:

Me alegra que les halla servidor brothers.
 
Atrás
Arriba