Foros del Web » Creando para Internet » Sistemas de gestión de contenidos » WordPress »

Error al crear un contador de visitas para cada posts

Estas en el tema de Error al crear un contador de visitas para cada posts en el foro de WordPress en Foros del Web. Buenas En un intento por guardar las visitas a cada post, he creado en la tabla wp_wpost un campo 'visitas' que se incremente en 1 ...
  #1 (permalink)  
Antiguo 27/11/2010, 05:33
 
Fecha de Ingreso: noviembre-2006
Mensajes: 102
Antigüedad: 18 años
Puntos: 1
Error al crear un contador de visitas para cada posts

Buenas

En un intento por guardar las visitas a cada post, he creado en la tabla wp_wpost un campo 'visitas' que se incremente en 1 cada vez que alguien visite un post.

En el archivo single.php, dentro del loop he incluido lo siguiente:

Código PHP:
$visita mysql_query("UPDATE wp_posts SET visita=visita+1 WHERE ID=".get_the_ID(),$link); 
de manera que el registro correspondiente se incremente en 1 cada vez que se entra en dicho post, PEEEEERO...... ¡me está incrementando tambien el campo 'visitas' del post inmediatamente posterior!. Quiero decir, si el ID del post que visito es el 91, me incremente en 1 el campo visitas del registro 91 y del 92

Es como si entrase en la siguiente iteración del bucle, pero entiendo que no debería.

¿Alguno de vosotros sabe por qué está ocurriendo esto?
  #2 (permalink)  
Antiguo 27/11/2010, 14:18
 
Fecha de Ingreso: julio-2009
Ubicación: Argentinalandia
Mensajes: 339
Antigüedad: 15 años, 4 meses
Puntos: 15
Respuesta: Error al crear un contador de visitas para cada posts

utiliza WP-PostView y deja los dolores de cabeza.
Introduce el include correspondiente donde quieras y estas hecho. puedes personalizar tambien a gusto para que cuente solo visitas, solo registrados, ambos, o ambos + buscadores


p.s.: creo que cuando abriste el parentesis, tomo el " como ' y esta esperando que lo cierres en algun momento. pero al margen de eso... hazme caso, usa el wp-postview.
__________________
Mi Perfil y Blog estan en Yeow.com.ar ✰✰✰✰✰
Pero en WONDED.COM estan Mis Proyectos OpenSource ;-)
  #3 (permalink)  
Antiguo 27/11/2010, 14:33
 
Fecha de Ingreso: noviembre-2006
Mensajes: 102
Antigüedad: 18 años
Puntos: 1
Respuesta: Error al crear un contador de visitas para cada posts

Lo que busco hacer no es lo que ofrece este plugin que me comentas. De hecho habia visto postCounts, pero para lo que busco hacer no me hace falta un plugin, simplemente una linea de codigo que es la que puse antes (y que es, de hecho, la que utiliza postCounts).

Es mas, funcionarme, me funciona, lo que ocurre es que el registro inmediatamente posterior tambien me lo incrementa, y es ahi donde no se por qué falla.

He hecho un monton de pruebas para saber si El Bucle vuelve a iterar, pero por los resultados, no lo parece. Por ejemplo, con hacer "the_ID()" me deberia imprimir por pantalla dos id's si iterase dos veces, pero no lo hace.

Por lo de las comillas no es , porque siempre utilizo los query de la misma manera, y nunca me ha fallado.

¿Alguna idea?
  #4 (permalink)  
Antiguo 27/11/2010, 16:22
Avatar de xavito  
Fecha de Ingreso: agosto-2003
Mensajes: 61
Antigüedad: 21 años, 2 meses
Puntos: 5
Respuesta: Error al crear un contador de visitas para cada posts

en vez de usar una tabla nueva podrias crear un custom field llamado contador.

Entonces con el get_post_meta y el ad_post_meta... (o algo parecido).
  #5 (permalink)  
Antiguo 27/11/2010, 19:45
 
Fecha de Ingreso: julio-2009
Ubicación: Argentinalandia
Mensajes: 339
Antigüedad: 15 años, 4 meses
Puntos: 15
Respuesta: Error al crear un contador de visitas para cada posts

planteo de un ignorante:

inicia iteracion para mostrar post
se pide pide el numero de post
se brinda el numero de post (ejemplo... id=90)
se muestra el contenido del post 90
se incrementan en 1 para dejar ya listo el bucle para la siguiente consulta? (el puntero queda al final de la consulta)
se realiza la inserción de +1 en "visitas"
termina el bucle

lo que esta en azul es una pregunta que yo me hago...
en otros lenguajes de programación, el puntero, una vez que se sitúa, hace la consulta y lee toda la fila, se para en la siguiente ya que finaliza de leer la fila consultada, sera esto lo que pasa?

opcion B)
pusiste en el lugar correcto el incremento +1 ?
__________________
Mi Perfil y Blog estan en Yeow.com.ar ✰✰✰✰✰
Pero en WONDED.COM estan Mis Proyectos OpenSource ;-)
  #6 (permalink)  
Antiguo 28/11/2010, 04:36
 
Fecha de Ingreso: noviembre-2006
Mensajes: 102
Antigüedad: 18 años
Puntos: 1
Respuesta: Error al crear un contador de visitas para cada posts

Cita:
Iniciado por xavito Ver Mensaje
en vez de usar una tabla nueva podrias crear un custom field llamado contador.

Entonces con el get_post_meta y el ad_post_meta... (o algo parecido).
No estoy usando una tabla nueva, simplemente he creado un campo 'visitas' en la tabla wp_posts

Cita:
Iniciado por pleter Ver Mensaje
inicia iteracion para mostrar post
se pide pide el numero de post
se brinda el numero de post (ejemplo... id=90)
se muestra el contenido del post 90
se incrementan en 1 para dejar ya listo el bucle para la siguiente consulta? (el puntero queda al final de la consulta)
se realiza la inserción de +1 en "visitas"
termina el bucle
En ese caso solo me incrementarian las visitas del siguiente post, y no del actual, y a mi se me estan incrementando los dos !!

Os voy a poner el codigo completo del archivo single.php:

Código PHP:
<?php get_header(); ?>

<div id="entry">       

<?php if (have_posts()) : ?>
<?php 
while (have_posts()) : the_post(); ?>
        
<?php
$hit 
mysql_query("UPDATE wp_posts SET post_hits = (post_hits + 1) WHERE ID =".get_the_ID(),$link);
?>
<div class="post recent" id="post-<?php the_ID(); ?>">
<div class="content">
<?php the_content();?>
</div>
</div> <!-- the content -->

<div class="meta">
<div class="tags"><?php the_tags(''', ''<br />'); ?></div>
<div class="cats"><?php the_category(', '?></div>
</div><!--meta-->
</div><!--post-->
<?php endwhile; ?>

<div class="alignleft"><?php next_posts_link('Older Entries'?></div>
<div class="alignright"><?php previous_posts_link('Newer Entries'?></div>        <br clear="all" />

<?php else : ?>
<?php 
endif; ?>

</div><!--entry-->

<?php get_footer();?>
Puede ser que me falte algo, porque no lo he copiado tal cual, pero las partes importantes están ahi, que son el inicio del bucle y el query a la base de datos.

Otra cosa interesante que he descubierto es que si entro a ver el post y rapidamente actualizo la pagina (antes de que cargue el contenido), solo me incrementa la visita de ese post, y no del siguiente. Entiendo que es porque no le ha dado tiempo a iterar.

Sabiendo esto, he probado a imprimir por pantalla el id con la funcion the_ID(), por lo que entiendo que , si el id del post es el 90, me deberia imprimir 9091, ¡pero no lo hace, porque solo imprime 90!

Esto ya es algo personal

Última edición por jemarquesini; 28/11/2010 a las 05:01
  #7 (permalink)  
Antiguo 28/11/2010, 11:05
 
Fecha de Ingreso: julio-2009
Ubicación: Argentinalandia
Mensajes: 339
Antigüedad: 15 años, 4 meses
Puntos: 15
Respuesta: Error al crear un contador de visitas para cada posts

Cita:
Iniciado por jemarquesini Ver Mensaje
Sabiendo esto, he probado a imprimir por pantalla el id con la funcion the_ID(), por lo que entiendo que , si el id del post es el 90, me deberia imprimir 9091, ¡pero no lo hace, porque solo imprime 90!
en todo caso seria 90, 91 porque 9091 seria otro post.
mira, pase simplemente porque ayer me dejaste pensando en este problema, pero ahora voy de salida, a la vuelta paso y lo miro mas profundamente.
(aunque cualquiera del foro puede ayudar tambien! jeje)

salu2
__________________
Mi Perfil y Blog estan en Yeow.com.ar ✰✰✰✰✰
Pero en WONDED.COM estan Mis Proyectos OpenSource ;-)
  #8 (permalink)  
Antiguo 28/11/2010, 13:49
 
Fecha de Ingreso: noviembre-2006
Mensajes: 102
Antigüedad: 18 años
Puntos: 1
Respuesta: Error al crear un contador de visitas para cada posts

Definitivamente, wordpress hace de algun modo dos iteraciones dentro de El Bucle. Me ha dado por poner lo siguiente

Código PHP:
$visita mysql_query("UPDATE wp_posts SET visitas = visitas+1 WHERE ID = 90",$link); 
Cuando miro en la base de datos, por cada visita que hago al post, me suma 2. Es decir, esta linea la ejecuta dos veces, lo que quiere decir que el bucle pasa por ella dos veces.

No entiendo, sin embargo, por qué si hago un echo get_the_id(), no me escribe por pantalla dos veces el id.

Voy a seguir intentando descubrir como puedo hacerlo. Si alguno me echais una mano (que no se al cuello) os lo agradeceré.
  #9 (permalink)  
Antiguo 28/11/2010, 14:11
 
Fecha de Ingreso: noviembre-2006
Mensajes: 102
Antigüedad: 18 años
Puntos: 1
Respuesta: Error al crear un contador de visitas para cada posts

Ummm, novedades.

Me ha dado por poner el query fuera del loop, fuera de cualquier parte de la pagina (despues del footer), y sigue haciendo lo mismo. Ya no se me ocurre nada mas. Lo que he puesto en la respuesta anterior no es correcto, ya que ahora estoy fuera del loop.

Buscaré otra manera, a menos que alguno me de una pista.
  #10 (permalink)  
Antiguo 29/11/2010, 07:05
 
Fecha de Ingreso: julio-2009
Ubicación: Argentinalandia
Mensajes: 339
Antigüedad: 15 años, 4 meses
Puntos: 15
Respuesta: Error al crear un contador de visitas para cada posts

Hazme un favor... reeemplaza esto:

Código PHP:
<?php if (have_posts()) : ?>
<?php 
while (have_posts()) : the_post(); ?>
por esto otro:

Código PHP:
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
se que es el mismo fin pero... por las dudas hazlo.
de este ultimo modo es como vienen casi todos los themes que conozco
no creo que sea eso.... pero... con probar no pierdes nada


------

otra cosa que me gustaría que pruebes... es que pongas la actualizacion por fuera del bucle, total, WP, cuando llama al single.php ya sabe que ID consultar...

haz algo como


Código PHP:
$sql "UPDATE `tabla`.`columna` SET `post_hits` = \'(post_hits + 1)\' WHERE `columna`.`ID` = post_id;"
antes de entrar al codigo haz una variable (post_id) con el contenido del resultado que da <?php the_ID(); ?> (por las dudas de que lo funcione poner la consulta derecho en la consulta sql)

si, es tedioso, pero estoy pensando alguna otra alternativa a ver como te lo puedo solucionar....
__________________
Mi Perfil y Blog estan en Yeow.com.ar ✰✰✰✰✰
Pero en WONDED.COM estan Mis Proyectos OpenSource ;-)

Última edición por pleter; 29/11/2010 a las 07:43
  #11 (permalink)  
Antiguo 29/11/2010, 12:02
 
Fecha de Ingreso: noviembre-2006
Mensajes: 102
Antigüedad: 18 años
Puntos: 1
Respuesta: Error al crear un contador de visitas para cada posts

Gracias pleter por tu ayuda

Lo ultimo que comentaba es que he puesto el query al final del codigo, fuera de el bucle, por detras incluso que el footer. Y sigue dando el mismo problema.

Sigo probando :P
  #12 (permalink)  
Antiguo 29/11/2010, 12:18
 
Fecha de Ingreso: noviembre-2006
Mensajes: 102
Antigüedad: 18 años
Puntos: 1
Respuesta: Error al crear un contador de visitas para cada posts

Bueno , despues de intentar esto y esto, que son maneras de buscar el id de un post fuera de el bucle, sin exito, he decidido dejarlo y buscar una manera diferente.

Usando estas opciones que acabo de comentar, he hecho lo siguiente al final del archivo single.php, justo despues del footer:

Código PHP:
global $wp_query;
$idPost $wp_query->post->ID;
echo 
$idPost;
$visita mysql_query("UPDATE wp_posts SET visitas = 10 WHERE ID = ".$idPost,$link); 
Pues resulta que , si el id del post es 90, me imprime por pantalla 90, pero me pone las visitas de los post 90 y 91 igual a 10, con lo que ya me ha desquiciado del todo. No creo que sea cosa de wordpress, ya debe ser cosa de mysql (?) o yo que se de que.

No obstante, si sabeis donde puede estar el problema, comentadlo ;)

Saludos
  #13 (permalink)  
Antiguo 29/11/2010, 12:44
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 20 años, 5 meses
Puntos: 832
Respuesta: Error al crear un contador de visitas para cada posts

Disculpa pero es una locura crear un campo en una tabla de núcleo para este fin y mucho menos usar consultas directas sin ningún dispositivo de seguridad (por eso es que ocurren los SQL injections y luego culpan a WordPress).

Usa la tabla $wpdb->postmeta y las funciones disponibles para armar los queries extra que necesites. Pega esto dentro de tu loop en single.php y pruébalo:
Código PHP:
Ver original
  1. <?php
  2. $conteo = get_post_meta(get_the_ID() , 'visitas' , true);
  3. $visitas = update_post_meta(get_the_ID() , 'visitas' , ($conteo + 1));
  4. echo '<p class="visitas">'. $conteo + 1 .'</p>';
  5. ?>
Y muerto el perro.

La falla que comentas (la actualización del otro post junto con el actual) posiblemente se deba a una falla del theme que estás usando, pues algunos diseñadores utilizan los loops de forma muy deportiva, sin darles el debido cierre. Single.php no tiene el mismo comportamiento que index.php o category.php, por lo cual este tipo de errores es muy frecuente, y sólo salen a la luz cuando implementamos funciones extra, como la que quieres lograr.
  #14 (permalink)  
Antiguo 29/11/2010, 13:29
 
Fecha de Ingreso: julio-2009
Ubicación: Argentinalandia
Mensajes: 339
Antigüedad: 15 años, 4 meses
Puntos: 15
Respuesta: Error al crear un contador de visitas para cada posts

tan sabio... era el unico que le podia dar solucion a este post :P
__________________
Mi Perfil y Blog estan en Yeow.com.ar ✰✰✰✰✰
Pero en WONDED.COM estan Mis Proyectos OpenSource ;-)
  #15 (permalink)  
Antiguo 29/11/2010, 16:05
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 9 meses
Puntos: 535
Respuesta: Error al crear un contador de visitas para cada posts

Pues nada, venía aquí con la intención de decir que lo he probado, porque no te creía jemarquesini (), y... tenés toda la razón! Recreé tu situación y, efectivamente, incrementa el contador del post en cuestión y el del siguiente. También incrementaba en 2 hardcodeando el ID en el query. De la única manera que pude hacer que se comporte de "manera correcta" fue dejando el siguiente código como único contenido del archivo single.php:

Código PHP:
Ver original
  1. $visita = mysql_query("UPDATE wp_posts SET visitas = visitas+1 WHERE ID = 90",$link);


Cita:
Iniciado por metacortex Ver Mensaje
La falla que comentas (la actualización del otro post junto con el actual) posiblemente se deba a una falla del theme que estás usando, pues algunos diseñadores utilizan los loops de forma muy deportiva, sin darles el debido cierre. Single.php no tiene el mismo comportamiento que index.php o category.php, por lo cual este tipo de errores es muy frecuente, y sólo salen a la luz cuando implementamos funciones extra, como la que quieres lograr.
No sé, no sé... a mi me ocurrió tanto con un theme que estoy haciendo como con el que viene por defecto con WP (que, se supone, o quiero creer, no debería estar hecho de manera tan deportiva como decís). Lo probé en ambos sólo para descartar justamente que sea un problema mío.

Cita:
Iniciado por metacortex Ver Mensaje
(1) Disculpa pero es una locura crear un campo en una tabla de núcleo para este fin (2) y mucho menos usar consultas directas sin ningún dispositivo de seguridad (por eso es que ocurren los SQL injections y luego culpan a WordPress).
De acuerdo con (1). Ahora, con respecto a (2)... la verdad no le veo mayor riesgo en cuanto a seguridad.

Abrazos
__________________
...___...
  #16 (permalink)  
Antiguo 29/11/2010, 17:12
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 20 años, 5 meses
Puntos: 832
Respuesta: Error al crear un contador de visitas para cada posts

Hey calma amigo,

Cita:
Iniciado por AlZuwaga Ver Mensaje
No sé, no sé... a mi me ocurrió tanto con un theme que estoy haciendo como con el que viene por defecto con WP (que, se supone, o quiero creer, no debería estar hecho de manera tan deportiva como decís). Lo probé en ambos sólo para descartar justamente que sea un problema mío.
Pues funciona correctamente en la plantilla Twenty Ten. Revisa si lo colocaste dentro del loop:

Código PHP:
Ver original
  1. <?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?>
  2. <?php
  3. $conteo = get_post_meta(get_the_ID() , 'visitas' , true);
  4. $visitas = update_post_meta(get_the_ID() , 'visitas' , ($conteo + 1));
  5. echo $conteo + 1;
  6. ?>
  7. ...

Cita:
Iniciado por AlZuwaga Ver Mensaje
... la verdad no le veo mayor riesgo en cuanto a seguridad.
Quizás sea porque al momento de escribirlo no tomaste en cuenta que después de todo estamos tratando con un CMS. En el caso del query que mencionas, la forma correcta y segura de escribirlo en WordPress sería:

Código PHP:
Ver original
  1. $visita = $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET visitas = visitas + 1 WHERE ID = ". get_the_ID()) );
Revisa esto: http://codex.wordpress.org/Function_...ection_Attacks

Pero en este caso es innecesario subir en escalera si tienes un ascensor. Existen funciones y recursos con todos esos dispositivos incluidos y muchos más, así como formas de proceder sin necesidad de alterar los datos de núcleo.
  #17 (permalink)  
Antiguo 29/11/2010, 17:37
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 9 meses
Puntos: 535
Respuesta: Error al crear un contador de visitas para cada posts

Hey, Meta, estoy super relajado ;)

Cita:
Pues funciona correctamente en la plantilla Twenty Ten. Revisa si lo colocaste dentro del loop:
Creo que no me logré explicar: En mi comentario, el que comienza con No sé, no sé..., quise decir que, tanto en mi theme como en Twenty Ten, la implementación que jemarquesini pretende hacer presenta exactamente el mismo inconveniente. No me refería a tu solución (que no probé ni necesito hacerlo, doy por sentado que funciona )

Cita:
Pero en este caso es innecesario subir en escalera si tienes un ascensor. Existen funciones y recursos con todos esos dispositivos incluidos y muchos más, así como formas de proceder sin necesidad de alterar los datos de núcleo.
Y sigo 100% de acuerdo con vos.
__________________
...___...
  #18 (permalink)  
Antiguo 01/12/2010, 12:33
 
Fecha de Ingreso: noviembre-2006
Mensajes: 102
Antigüedad: 18 años
Puntos: 1
Respuesta: Error al crear un contador de visitas para cada posts

Bueno, despues de todo lo comentado, he probado con la opcion que dio metacortex (y en su momento xavito) de usar los metadatos, y no os lo vais a creer.... cuando visito el post 90, me graba la visita del post 90 como metadato... ¡¡ y la del post 91 tambien !!

Cuando he hecho la prueba, entro en el post 90 y me imprime por pantalla "visitas:1". Actualizo la pagina, e imprime "Visitas: 2". Digo "bien, vamos a probar con el post 91". Entro en el post 91 y me imprime por pantalla "visitas: 3" wtf ?!?

Lo estoy flipando, en serio, porque es para verlo. Menos mal que a gente como AlZuwaga le ha pasado lo mismo, porque me volveria tonto :P

Última edición por jemarquesini; 01/12/2010 a las 12:41
  #19 (permalink)  
Antiguo 01/12/2010, 17:17
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 20 años, 5 meses
Puntos: 832
Respuesta: Error al crear un contador de visitas para cada posts

Cierto, hace rato probé con mi propia página; se incrementa en el post actual y en el siguiente. A ver si le echo coco a esto en un rato. En la plantilla Twenty Ten no lo hace, habría que averiguar por qué en esa no y en las otras sí.

Etiquetas: contador, visitas, post
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:03.