Programación
está resueltoEn las opciones de comentarios he puesto en "Separa los comentarios en páginas de" el valor de 15.
El problema es que la numeración funciona mal cuando hay más de una página. Como podéis ver en el ejemplo que pongo más abajo, la numeración se reinicia en cada página:
http://www.almendron.com/blog/2366/igualdad-y-permisos/
En commnents.php uso la función "paginate_comments_links"
En el archivo functions.php del tema uso "function list_comments". La función se inica con las siguientes líneas:
function list_comments($comment, $args, $depth) {
$GLOBALS['comment'] = $comment;
global $commentcount;
if(!$commentcount) { $commentcount = 0; }
Después siguen unas cuantas líneas de código y la parte relativa a la numeración es así:
<?php printf('#%1$s', ++$commentcount); ?>
¿Cómo puedo hacer para que no reinicie la numeración al pasar de página?
He podido comprobar que es en la línea if(!$commentcount) { $commentcount = 0; } donde se encuentra el problema.
Habría que sustituir $commentcount = 0; por un condicional de forma que el valor no sea cero cuando pasa de página.
¿Cómo lo podría hacer?
¿Nadie puede ayudarme?
Al final del archivo functions.php de tu theme hay una función list_comments, sustituye
if(!$commentcount) { $commentcount = 0; }
por
if(!$commentcount) { $commentcount = (get_option('comments_per_page') * get_query_var('cpage')) - get_option('comments_per_page'); }
Lo que hace es que $commentcount se modifique según la página.
Nº de comentarios por página multiplicado Nº de páginas menos Nº de comentarios por página
Por cierto, deberías mostrar primero la primera página de comentarios y no la última, no lo he probado como lo tienes pero no creo que haya mayor problema. La diferencia es que la numeración de los comentarios empezaría por 1 y no a medias como lo tienes ahora. Esto no afecta a la forma de mostrar los comentarios más antiguos o más nuevos primero.
Ya me dirás
Un saludo
Gracias por echarme una mano.
Como no se me había copiado bien lo que habías puesto, me comenzaba por el 16. Después ya he conseguido copiar toda la línea. En cualquier caso, ya había puesto
if(!$commentcount) { $commentcount = (get_option('comments_per_page') * (get_query_var('cpage') - 1 )) ; }`
y lo he dejado así porque funciona igual.
No obstante, el problema persiste porque "comments_per_page" no cuenta las respuestas cuando se utilizar la función Contestar (reply). Esto hace que, por ejemplo, en la página 23 haya más de 15 comentarios.
Si te fijas, la página 23 acaba en el número 356 y las 24 se inicia en el 346.
Por favor, avisa cuando hayas visto el problema para dejar el código como estaba.
Vaya hombre... He visto lo que dices.
Estoooooo... ¿Y antes como contaba los reply? Es decir, mostraba 15 o seguía contando hasta terminar. ¿Cómo debería o te gustaría que saliera? ¿El mismo número que el comentario?
No parece mayor problema si es así. Lo miro y te digo...
Un saludo
Lo primero de todo, muchas gracias. Se que no es un problema fácil de resolver y que te lleva bastante tiempo el mirarlo.
Ya lo he dejado como estaba. Como puedes comprobar, la numeración comienza por 1 en cada página y cuenta los reply porque está la variable ++$commentcount.
De hecho, la línea if(!$commentcount) { $commentcount = 0; } solo afecta al primer comentario de cada página. Luego la variable ++$commentcount se encarga de ir poniendo la numeración. Por motivos que desconozco, dicha variable se pierde al pasar de página.
La función completa: http://tinypaste.com/b2eac8d4
¿Cómo lo quiero dejar? Como lo de antes pero contando las réplicas, es decir, numeración correlativa comenzando por 1, 2, ..., n y sin que influya el cambio de página.
Un saludo.
Al final, he buscado un plugin que hiciera lo que buscaba y he encontrado uno: Greg's Threaded Comment Numbering.
Tiene dos modos: uno automático (se pierden los estilos de los comentarios) y otro manual que es el que he usado.
En functions.php, función list_comments hay que hacer los siguientes cambios:
1) if(!$commentcount) { $commentcount = 0; } lo he sustituido por $commentcount = gtcn_comment_numbering($comment->comment_ID, $args, $wrapclass, 'quiet');
2) ++$commentcount lo he sustituido por $commentcount
Problema: el número total de comentarios no se corresponde a la numeración ya que el primero también cuenta las réplicas.
De momento no he subido nada al servidor y estoy haciendo las pruebas en local.
Vamos avanzando: ya he conseguido contar por separado los comentarios de las réplicas.
1) En functions.php
function c_parent_comment_counter($id){
global $wpdb;
$query = "SELECT COUNT(comment_post_id) AS count FROM $wpdb->comments WHEREcomment_approved= 1 ANDcomment_post_ID= $id ANDcomment_parent= 0";
$parents = $wpdb->get_row($query);
return $parents->count;
}
Nota: comment_approved, comment_post_ID y comment_parent llevan una tilde inversa al principio y otra al final.
2) En comments.php
<?php
$number_of_parents = c_parent_comment_counter($post->ID);
$number_of_children = $post->comment_count - $number_of_parents;
?>
Después colocar $number_of_parents y $number_of_children allí donde queramos que aparezcan.
A ver si ahora puedo compaginar las distintas funciones y evitar el uso del plugin.
Para LGrusin: si tienes un rato y no sabes qué hacer...
Echa un vistazo al plugin a ver si se puede extraer la función gtcn_comment_numbering (la única que necesito del plugin) y así no tener que usarlo. Yo lo he intentado pero no hay forma.
Gracias.
Ok intentaré mirarlo pero seguro que es con llamadas a la base de datos cosa que quiero evitar.
Sobre lo anterior te respondo...
Lo del contador a cero tiene su explicación, cada vez que llamas a la función list_comments la variable $commentcount se pone a cero. Por eso inicia la cuenta en cada página.
if(!$commentcount) { $commentcount = 0; }
El otro problema es que muestras los comentarios por niveles y parece que WordPress no trata a los comentarios hijos como comentarios a pesar de que si los cuenta como tales. No hay forma de saber de antemano cuantas réplicas hay en un comentario de manera que es dificil controlar el contador.
Si quitas la opción de mostrar las réplicas en niveles el código que puse antes funciona bien puesto que las réplicas o comentarios hijos son tratados igual que los comentarios padres. Yo había hecho esta prueba sin mostrar los comentarios en niveles.
Formas de solucionarlo
1 - No permitiendo niveles en los comentarios. Esto muestra el número coincidiendo con el número real de comentarios
2 - Modificando el contador $commentcount para que no sume cuando se trate de una réplica. Esto no mostraría el número real de comentarios. Esto lo he conseguido pero no te gusta puesto que quieres que sume siempre sea comentario padre o comentario hijo.
Si se me ocurre algo ya te comento.
Un saludo
Lo del contador a cero tiene su explicación, cada vez que llamas a la función list_comments la variable $commentcount se pone a cero. Por eso inicia la cuenta en cada página.
if(!$commentcount) { $commentcount = 0; }
Lo curioso del caso es que si quitas esa línea, no se guarda el valor de la variable al pasar de página.
La solución más sencilla sería esa, es decir, que se pudiera guardar la variable $commentcount al pasar de página con lo que la numeración sería correcta.
Muchas gracias por tu interés.
He visto que has quitado los anidamientos o niveles de las réplicas en los comentarios. Tal como lo tienes puesto ahora siempre se muestran 15 comentarios independientemente de si son padres hijos o réplicas o como prefieras llamarlo...
De esta forma que lo tienes puesto ahora si funciona bien el código que te he puesto anteriormente. El problema sólo se produce con los anidamientos. No sé si es un bug o qué pero no me parece normal que le digas 15 y te muestre 60 porque cada comentario tiene 3 réplicas por poner un ejemplo.
Formas de solucionarlo
1 - No permitiendo niveles en los comentarios. Esto muestra el número coincidiendo con el número real de comentarios
No obstante, el problema persiste porque "comments_per_page" no cuenta las respuestas cuando se utilizar la función Contestar (reply). Esto hace que, por ejemplo, en la página 23 haya más de 15 comentarios.
Si te fijas, la página 23 acaba en el número 356 y las 24 se inicia en el 346.
Pues eso mismo...
Un saludo
Pues no, no es normal pero muestra 60 si cada comentario tiene 3 réplicas. De hecho, cuando cuentas los comentarios, tampoco las tiene en cuenta.
He subido los cambios al servidor para que lo puedas ver:
http://www.almendron.com/blog/2366/igualdad-y-permisos/
Ahora sale lo que quiero, pero he tenido que instalar un plugin y modificar functions.php para separar el número de comentarios de las réplicas (con llamada a la base de datos incluida).
¡Casi nada! Y todo porque no somos capaces de que la variable $commentcount conserve su valor al pasar de página. Este el quid de la cuestión.
he tenido que instalar un plugin y modificar functions.php para separar el número de comentarios de las réplicas
¿Y eso para qué? No hace falta plugin si sólo quieres contar las réplicas. Obtener los valores no es el problema. El problema está en averiguar qué comentarios tienen réplicas y cuantas. Esto es necesario para renumerar los comentarios.
La dichosa variable $commentcount se ejecuta tantas veces como comentarios haya. Puesto que las réplicas también son comentarios es imposible saber de antemano cuantas habrá en 15 comentarios (o los que sean) a no ser que se averigue con otra consulta duplicada para los comentarios. Si tienes 300 comentarios supongo que se ralentiza bastante el blog al hacer dos operaciones en vez de una.
Otra opción es modificar por completo la función list_comments para que cuente de otra manera. Las funciones de los comentarios se ejecutan por pasadas como si fuera un bucle. De manera que los valores se van "pisando" tantas veces como comentarios haya.
En fin... el tema es muy interesante pero no tiene fácil solución.
Por cierto, este hilo debería ir en Programación. Menudo rollo le estamos contando a la gente...
Un saludo
Pues cámbialo si quieres jajajaja
De manera que los valores se van "pisando" tantas veces como comentarios haya.
Creo que es más correcto "tantas veces como páginas de comentarios haya".
Cuando solo hay una página: imagina que hay 20 comentarios y 60 réplicas. El código, tal y como lo tenía antes, numeraba de 1 al 80, es decir, lo hace bien.
Cuando hay más de una página:
Olvida por un momento lo de las réplicas. El hecho es que:
1) Comentarios por página = 15. No cuenta las réplicas.
2) Primera página: hay 15 comentarios y 10 réplicas. Usamos la variable $commentcount y se numeran TODOS por lo que el último tiene el número 25.
3) Segunda página: se pierde la variable $commentcount.
Lo voy a plantear de otra forma: ¿cómo lo haces para usar una variable que viene de una página o post distinto?
EDITO:: Olvida la última pregunta. Solo nos valdría si entráramos en la primera página y fuéramos navegando de forma secuencial.
La única forma que veo es que, al ir a una página en concreto, contara todos los comentarios (incluyendo las réplicas) que hubiera hasta la página anterior.
Por su puesto que las páginas intervienen en el desaguisado, en realidad son varios parámetros que hay que saber antes de realizar la consulta.
Es decir,
1 - Conocemos las páginas, get_query_var('cpage'))
2 - Conocemos los comentarios por página, get_option('comments_per_page')
3 - No conocemos las réplicas por página, $replicas[cpage-1]
De esta forma sabríamos el valor del contador de comentarios totales, get_option('comments_per_page') + $replicas[cpage-1]
Estos valores no se pueden obtener en el mismo bucle. Para conseguirlos hay que realizar otra consulta anterior a los comentarios, o bien en el single.php o en comments.php
El problema, ¿Cómo obtener las réplicas de una página de comentarios concreta? Una vez resuelto esto ya se daría con la solución.
Saludos
Yo no le he conseguido
A ver si tengo tiempo este fin de semana y pruebo lo siguiente:
Dentro de functions.php, en la parte de los comentarios, tal vez se pueda saber si es un comentario normal o una réplica:
Creo que un comentario normal queda marcado con un cero en el campo parent. Pues bien:
if ($comment->parent == 0), es decir, si es un comentario normal ++$commentcount y luego aplicamos la fórmula de las páginas. Con esto conseguimos que numere los comentarios normales y nos aseguramos que no sea cero cada vez que comience una página.
Ahora nos quedaría numerar las réplicas. Podríamos numerar con "numero comentario padre" + "contador para las réplicas".
Comentario normal: 1
Réplica al comentario normal: 1.1
Réplica al comentario normal: 1.2
Réplica a la réplica anterior: 1.3 (el plugin que uso pondría pondría 1.2.1, pero no se cómo se podría distinguir una "réplica a un comentario" de una "réplica a una réplica").
Réplica al comentario normal: 1.4 (el plugin pondría 1.3)
Comentario normal: 2 (aquí el contador para las réplicas debería ponerse a cero)
Réplica al comentario normal: 2.1
......
Le echaré un vistazo a la tabla a ver cómo marca el campo parent.
Contar por separado comentarios y réplicas en una entrada individual: SOLUCIONADO
Como ya había comentado, empleaba la función "c_parent_comment_counter" (ver más arriba) para mostrar por separado el número de comentarios y el de las réplicas. Esto es importante para que sea igual este dato que la numeración. Pues bien, no hace falta esa función. Basta con poner este código en comments.php:
<?php
$numPingBacks = 0;
$numComments = 0;
$numReply = 0;
foreach ($comments as $comment)
if (get_comment_type() != "comment") {
$numPingBacks++;
} else {
if ($comment->comment_parent == 0) {
$numComments++;
} else {
$numReply++;
}
}
?>
Después basta con colocar las variables $numPingBacks, $numComments y $numReply donde queramos que se muestren.
Debes Identificarte para publicar.