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

Evitar duplicados al extraer comentarios de la wpdb con foreach.

Estas en el tema de Evitar duplicados al extraer comentarios de la wpdb con foreach. en el foro de WordPress en Foros del Web. Muy buenas tardes. Mi objetivo es listar en una parte del theme, los posts sobre los que se ha hecho un comentario recientemente. Quiero hacer ...
  #1 (permalink)  
Antiguo 09/08/2012, 14:11
 
Fecha de Ingreso: abril-2011
Mensajes: 72
Antigüedad: 13 años, 7 meses
Puntos: 0
Pregunta Evitar duplicados al extraer comentarios de la wpdb con foreach.

Muy buenas tardes.

Mi objetivo es listar en una parte del theme, los posts sobre los que se ha hecho un comentario recientemente. Quiero hacer una lista de pongamos 10 (la cantidad no es un problema).

El código que uso es este.

Código PHP:
 <?php
  
global $wpdb;
  
$sql "SELECT DISTINCT ID, post_title, post_type, comment_ID, comment_post_ID, comment_author, comment_date, comment_approved, comment_type,comment_author_url, SUBSTRING(comment_content,1,50) AS com_excerpt FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID) WHERE comment_approved = '1' AND comment_type = '' AND post_type = 'post' ORDER BY comment_date_gmt DESC LIMIT 10";
?>
[...]
<?php
 $comments 
$wpdb->get_results($sql);
foreach (
$comments as $comment) {
$frase strip_tags($comment->comment_ID);
 
$tema strip_tags($comment->comment_post_ID);
 
$ruta get_permalink($tema);
 
$excerpt get_the_title($tema);
$tiempo strip_tags($comment->comment_date);
El "problema" es que si se escribe más de un comentario sobre el mismo post, lo refleja lógicamente dos veces en esa lista. Lo que quiero es que solo aparezca una vez cada post, independientemente de los comentarios que haya sobre él, es decir, que no se duplique un tema si ya aparece en esa lista y que se lo salte.
He probado con array_unique() pero no funciona, creo que por el formato en el que se compone el array StdClass Object etc.
Alguien sabe alguna forma sencilla? Quizás cambiando simplemente la consulta se pueda, pero no es mi fuerte y me sería de mucha ayuda un cable.

Muchas gracias de antemano por vuestra ayuda.
  #2 (permalink)  
Antiguo 09/08/2012, 14:47
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: Evitar duplicados al extraer comentarios de la wpdb con foreach.

Podrías poner un ejemplo real de cómo se vería esa lista? Digo, qué campos vas a usar de toda esa sentencia SQL y de qué manera?
__________________
...___...
  #3 (permalink)  
Antiguo 09/08/2012, 14:50
Avatar de hasdpk  
Fecha de Ingreso: agosto-2011
Ubicación: $spain->city( 'Arucas' );
Mensajes: 1.800
Antigüedad: 13 años, 2 meses
Puntos: 297
Respuesta: Evitar duplicados al extraer comentarios de la wpdb con foreach.

Desde mi punto de vista tiene la consulta mal, prueba con la siguiente:

Código SQL:
Ver original
  1. SELECT MAX( comment_ID ) AS comment_ID, comment_post_ID FROM {$wpdb->comments} WHERE comment_approved = 1 GROUP BY comment_post_ID ORDER BY comment_date DESC

Con esta consulta obtienes las IDs de los últimos comentarios y que estén aprobados.
__________________
Freelance Developer — www.rubenmartin.me PHP, SQL, Wordpress, Prestashop, Codeigniter, Laravel
RegaloConsolas — www.regaloconsolas.com Sorteo juegos, consolas y accesorios
  #4 (permalink)  
Antiguo 09/08/2012, 15:09
 
Fecha de Ingreso: abril-2011
Mensajes: 72
Antigüedad: 13 años, 7 meses
Puntos: 0
De acuerdo Respuesta: Evitar duplicados al extraer comentarios de la wpdb con foreach.

Cita:
Iniciado por AlZuwaga Ver Mensaje
Podrías poner un ejemplo real de cómo se vería esa lista? Digo, qué campos vas a usar de toda esa sentencia SQL y de qué manera?
Por supuesto, gracias por vuestro interés.

Código HTML:
<table border="0" width="90%" style="border-collapse: collapse">
		<tr>
			<td colspan="2"><i><font face="Trebuchet MS" size="2" color="#ffffff"><strong>Respondidos
			recientemente<br /><br /></font></strong></i></td> <?php
  global $wpdb;
  $sql = "SELECT DISTINCT ID, post_title, post_type, comment_ID, comment_post_ID, comment_author, comment_date, comment_approved, comment_type,comment_author_url, SUBSTRING(comment_content,1,50) AS com_excerpt FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID) WHERE comment_approved = '1' AND comment_type = '' AND post_type = 'post' ORDER BY comment_date_gmt DESC LIMIT 10";
?>
		</tr>
<?php
 $comments = $wpdb->get_results($sql);
foreach ($comments as $comment) {
$frase = strip_tags($comment->comment_ID);
 $tema = strip_tags($comment->comment_post_ID);
 $ruta = get_permalink($tema);
 $excerpt = get_the_title($tema);
$tiempo = strip_tags($comment->comment_date); 





  ?>
 <tr><td border=0 width=10>
			    </td>
			    <td align="left" bgcolor="#444444"> &nbsp;&nbsp;&nbsp; <a href="<?php echo $ruta; ?>"><?php echo $excerpt; ?></a><font face="Trebuchet MS" size=1 color="#b5b5b5"><i>&nbsp; <?php  echo 'Hace '.human_time_diff(get_comment_time('U'), current_time('timestamp')); ?></i></font><br>
	  
			    </td></tr><?php }; ?> </table> 
Sé que a lo mejor está solicitando muchos campos que no utilizo, pero de Sql no sé mucho y a base de leer en foros y artículos de ayuda, con alguna modificación pude conseguir que al menos los extraiga.

Olvidé mencionar un punto, y es que el post_type tiene que ser post, porque tengo otros implementados de los que no quiero que se muestren, tan sólo de las entradas.

Gracias a los dos por vuestra ayuda.
  #5 (permalink)  
Antiguo 09/08/2012, 21:15
 
Fecha de Ingreso: abril-2011
Mensajes: 72
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Evitar duplicados al extraer comentarios de la wpdb con foreach.

Gracias por tu aporte hasdpk. Aunque esa consulta no funcione me dió la pista del GROUP BY, con eso ha quedado resuelto.

Un saludo grande paisano... :P

Gracias a los dos por la ayuda. Fantástico!
  #6 (permalink)  
Antiguo 10/08/2012, 04:08
Avatar de hasdpk  
Fecha de Ingreso: agosto-2011
Ubicación: $spain->city( 'Arucas' );
Mensajes: 1.800
Antigüedad: 13 años, 2 meses
Puntos: 297
Respuesta: Evitar duplicados al extraer comentarios de la wpdb con foreach.

Revisa el resultado porque a mi sólo el GROUP BY me devolvía el primer valor de ese grupo, por eso tube que usar el MAX() en el SELECT para que me cogiera el valor más alto (última ID)
__________________
Freelance Developer — www.rubenmartin.me PHP, SQL, Wordpress, Prestashop, Codeigniter, Laravel
RegaloConsolas — www.regaloconsolas.com Sorteo juegos, consolas y accesorios
  #7 (permalink)  
Antiguo 11/08/2012, 12:33
 
Fecha de Ingreso: abril-2011
Mensajes: 72
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Evitar duplicados al extraer comentarios de la wpdb con foreach.

Lo he revisado pero no me muestra nada, ningún resultado.
El problema que me he encontrado ahora, es que como se ve en el código que puse anteriormente, lo que hice fue añadirle el GROUP BY comment_post_id para que solamente mostrase uno de cada tema, de la siguiente manera.

Código PHP:
$sql "SELECT DISTINCT ID, post_title, post_type, comment_ID, comment_post_ID, comment_author, comment_date, comment_approved, comment_type,comment_author_url, SUBSTRING(comment_content,1,50) AS com_excerpt FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID) WHERE comment_approved = '1' AND comment_type = '' AND post_type = 'post'  GROUP BY comment_post_ID ORDER BY comment_date_gmt  DESC LIMIT 10" 
El problema que surge es que como se ve arriba me interesa mostrar el tiempo que hace que se ha hecho dicho comentario. Y si uso el GROUP me muestra en realidad la fecha en la que se escribe el primer comentario, supongo que porque agrupa al resto obviándolos. La opción ASC tampoco me sirve porque eso muestra las más antiguas.

¿Alguna idea?

Muchas gracias por vuestra ayuda!!
  #8 (permalink)  
Antiguo 11/08/2012, 13:27
Avatar de hasdpk  
Fecha de Ingreso: agosto-2011
Ubicación: $spain->city( 'Arucas' );
Mensajes: 1.800
Antigüedad: 13 años, 2 meses
Puntos: 297
Respuesta: Evitar duplicados al extraer comentarios de la wpdb con foreach.

Debes de poner MAX() a comment_ID y en principio se solucionará, de todas formas, es mejor que uses mi consulta, es más sencilla y obtienes el mismo resultado si usas las funciones que ya vienen con Wordpress.

Por ejemplo:

Código PHP:
Ver original
  1. <?php
  2.  
  3. global $wpdb;
  4. $comments = $wpdb->get_results( 'SELECT MAX( comment_ID ) AS comment_ID, comment_post_ID AS post_ID FROM {$wpdb->comments} WHERE comment_approved = 1 GROUP BY comment_post_ID ORDER BY comment_date DESC', ARRAY_A );
  5.  
  6. foreach ( $comments as $coment ) {
  7.     get_the_title( $comment['post_ID'] );
  8. }
  9.  
  10. ?>
__________________
Freelance Developer — www.rubenmartin.me PHP, SQL, Wordpress, Prestashop, Codeigniter, Laravel
RegaloConsolas — www.regaloconsolas.com Sorteo juegos, consolas y accesorios
  #9 (permalink)  
Antiguo 11/08/2012, 14:51
 
Fecha de Ingreso: abril-2011
Mensajes: 72
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Evitar duplicados al extraer comentarios de la wpdb con foreach.

El print_r de esa consulta no devuelve nada... es por eso que dije que no me funcionaba antes.
  #10 (permalink)  
Antiguo 12/08/2012, 03:45
Avatar de hasdpk  
Fecha de Ingreso: agosto-2011
Ubicación: $spain->city( 'Arucas' );
Mensajes: 1.800
Antigüedad: 13 años, 2 meses
Puntos: 297
Respuesta: Evitar duplicados al extraer comentarios de la wpdb con foreach.

Cuando cree la consulta lo hice con varios comentarios a modo de prueba y me funcionó perfectamenete.

Esta captura es con el comentario que viene por defecto en el Wordpress.



Si todavía tienes dudas de si la consulta devuelve los valores correctamente, pégala en PHPMyAdmin y verás lo que devuelve realmente como yo he hecho ahora.
__________________
Freelance Developer — www.rubenmartin.me PHP, SQL, Wordpress, Prestashop, Codeigniter, Laravel
RegaloConsolas — www.regaloconsolas.com Sorteo juegos, consolas y accesorios
  #11 (permalink)  
Antiguo 13/08/2012, 19:54
 
Fecha de Ingreso: abril-2011
Mensajes: 72
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Evitar duplicados al extraer comentarios de la wpdb con foreach.

Vale, tienes razón. Mi consulta no funcionaba sin el prefijo, no sé por qué.
De todas maneras viendo la consulta me devuelve los resultados dentro del array, pero de todos los comentarios, y mi intención era que sólo fuesen los de post_type 'post' ya que tengo otros registrados que no me interesan.
Al realizar la búsqueda dentro de la tabla de comentarios es correcto, pero no sé como implementar la búsqueda a la tabla de posts... en la consulta que tenía arriba lo hace, pero tengo el problema comentado anteriormente.
¿Sabes como combinarlas?

Infinitas gracias por tu paciencia y disculpa por haber dudado de la consulta, era sin duda un error mío.

Un saludo

Etiquetas: comments, foreach, wpdb
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 16:55.