un blog, o eso creo



Evitando el spam (II)

Archivado en: Blogocosa, Internet, Trucos, WordPress — Martín @ 21:37 07/03/2005

Vaya, parece que funciona. He puesto en práctica la idea del post anterior y no va mal. Configuré el asunto para que cuando un bot caiga en la trampa se me envíe un e-mail, y en cuatro minutos de reloj van 29 avisos (¿y a que no véis ningún anuncio de online poker?). O estáis comentando como locos y esto funciona mal, o funciona realmente bien :)

Al final resultó en un par de cambios muy sencillitos, fácilmente adaptables a cualquier sistema de publicación de contenidos. Estos son los cambios que yo he hecho en el WordPress 1.2.2 (no sé si valdrá para otras versiones, pero si no, la diferencia será mínima):

  • En el archivo wp-comments.php debemos añadir un textarea más, para engañar al bot atontado. Para ello, si en el formulario de comentarios tenemos por ejemplo esto:

    <textarea name="comment" id="comment" cols="60" rows="8"></textarea>

    Bastará con que añadamos otro campo similar, pero con otro name y otro id (que será el que realmente usemos, quedando el original como atrapabots), quedando así la cosa:

    <textarea name="antispam" id="antispam" cols="60" rows="8"></textarea>
    <textarea name="comment" id="comment" cols="60" rows="8"></textarea>

  • En el archivo wp-comments-post.php hay que ingeniárselas mejor. Al principio del archivo, justo después del <?php (esto es importante), dejamos caer estas líneas:

    if(strlen($_POST['comment']) > 3) {
    header("Location: http://www.google.co.kr");
    mail("aqui@tu.email", "Un spambot atontado", "Un spambot se ha metido en el agujero.Ha dicho:\n\n" . $_POST['comment']);
    exit;
    }

    Además hay que cambiar $comment = trim($_POST['comment']); por $comment = trim($_POST['antispam']);.

    Ojo con esto. En la primera línea se comprueba si el campo comment (recordemos: campo que antes era utilizado para enviar los comentarios) tiene más de 3 caracteres. Si el bot ha rellenado el campo comment (como es lógico que hará, porque así está programado), lo mandaremos a Google Corea. Esto es a voluntad de cada uno :). Con la siguiente línea estamos enviándonos un e-mail de aviso de cada bot que ha intentado colárnosla. Recomiendo quitarla una vez que comprobemos que el sistema funciona. Por cierto, hay que poner el e-mail propio substituyendo lo de aqui@tu.email, obviamente.

  • Ahora sólo queda editar nuestros estilos CSS, añadiendo la siguiente declaración:

    #comment {
    display: none;
    visibility: hidden;
    position: absolute;
    margin-left: -1000px;
    }

    Todas esas propiedades son para asegurarnos que realmente el campo-trampa se oculta al usuario. Y ya está.

Sólo recomiendo esta solución a quienes sepan lo que hacen, pues esto no es código de copiar y pegar, hay que entender lo que se hace, pues podemos cargarnos algo. Ya diréis si funciona o no.

En lo que tardé en escribir el post ya tengo 62 avisos de spam… debe funcionar, sí…

WordPress 1.5

Archivado en: WordPress — Martín @ 00:41 19/02/2005

Ya está listo el WordPress 1.5. Habrá que probarlo, tiene cosillas nuevas.

Wordpress: separar los comentarios de los trackbacks

Archivado en: WordPress — Martín @ 00:53 24/06/2004

Como otras veces tengo comentado, hay pocas cosas de WordPress que me disgusten. Pero las pocas que hay, conseguí arreglarlas en mayor o menor medida. Concretamente, hay una cosa que no tengo ni idea de por qué la han hecho así y me saca de quicio, pero en los foros de soporte no se ven muchas quejas relacionadas: se trata de la forma de mostrar los trackbacks, mezclados entre los comentarios. Desde el primer día, fue una cosa que me desorientó totalmente. ¿Esto es un comentario? ¿O un trackback? ¿Por qué una web deja un comentario en mi weblog?. Además, parece que yo no soy el único al que esto le molesta: ya recibí unos cuantos mensajes acerca de publicar cómo se podría hacer esto. Por cierto, podéis sugerirme temas acerca de la modificación de WordPress, no hay ningún problema :)

Como decía, al final decidí separarlos, lo cual resultó bastante sencillo: WordPress almacena tanto los comentarios como los trackbacks (y pingbacks) en la misma tabla. Lo único que los diferencia es que los trackbacks y pingbacks empiezan por <trackback /> o <pingback />, respectivamente. Así que si se tiene un poco de idea de SQL será fácil separarlos. Bastará con concretar un poco más la consulta que se hace para extraer los comentarios, y duplicarla para sacar los trackbacks. Tan sencillo como aquí lo explico:

Vamos a trabajar sólamente sobre el archivo wp-comments.php, localizado en el directorio raíz donde esté WordPress. Lo abrimos con nuestro editor de texto favorito y localizamos la siguiente línea, casi al principio:

$comments = $wpdb->get_results("SELECT * FROM $tablecomments WHERE comment_post_ID = '$id' AND comment_approved = '1' ORDER BY comment_date");

A esta línea le hacemos un pequeño cambio, tal que así:

$comments = $wpdb->get_results("SELECT * FROM $tablecomments WHERE comment_post_ID = '$id' AND comment_approved = '1' AND comment_content NOT LIKE '<%back />%' ORDER BY comment_date");

Copiamos esta línea justo debajo, pero haciendo los cambios señalados (ojo, hay que eliminar el NOT y cambiar la variable de nombre):

$trackbacks = $wpdb->get_results("SELECT * FROM $tablecomments WHERE comment_post_ID = '$id' AND comment_approved = '1' AND comment_content LIKE '<%back />%' ORDER BY comment_date");

Con esto estamos haciendo dos consultas: la primera seleccionará todos los comentarios que no empiecen por <%back /> (el símbolo % en MySQL indica una serie cualquiera de caracteres), mientras que la segunda hará justo lo contrario.

Ahora sólo nos queda mostrar el resultado de la segunda consulta. Localizamos, un poco más abajo, el bloque de código que nos sirve para mostrar los comentarios:

<?php if ($comments) { ?>
<ol id="commentlist">
<?php foreach ($comments as $comment) { ?>
<li id="comment-<?php comment_ID() ?>">
<?php comment_text() ?>
<p><cite><?php comment_type(); ?> <?php _e("by"); ?> <?php comment_author_link() ?> — <?php comment_date() ?> @ <a href="#comment-<?php comment_ID() ?>"<?php comment_time() ?></a></cite> <?php edit_comment_link(__("Edit This"), " |"); ?></p>
</li> <?php } // end for each comment ?>
</ol>
<?php } else { // this is displayed if there are no comments so far ?>
<p>Todavía no hay comentarios.</p>
<?php } ?>

Seguidamente copiamos justo debajo, pero con las pertinentes modificaciones, también señaladas:

<?php if ($trackbacks) { ?>
<ol id="trackbacklist">
<?php foreach ($trackbacks as $trackback) { ?>
<li id="trackback-<?php comment_ID() ?>">
<?php comment_text() ?>
<p><cite><?php comment_type(); ?> <?php _e("by"); ?> <?php comment_author_link() ?> — <?php comment_date() ?> @ <a href="#trackback-<?php comment_ID() ?>"<?php comment_time() ?></a></cite> <?php edit_comment_link(__("Edit This"), " |"); ?></p>
</li> <?php } // end for each comment ?>
</ol> <?php } else { // this is displayed if there are no comments so far ?>
<p>Todavía no hay trackbacks.</p>
<?php } ?>

Y ya está. Esto es lo básico que se necesita para separar comentarios de trackbacks en WordPress. A partir de aquí cada uno deberá modificar el tema a su gusto, y adaptarlo a su plantilla actual si procede (para el ejemplo utilicé la plantilla por defecto). Si tenéis alguna pregunta, no dudéis en dejarme un comentario.

Actualizado: había un error bastante tonto en las consultas y, haciendo las modificaciones que aquí se mostraban, no se mostraban ni comentarios ni trackbacks. Ahora está arreglado; gracias a FrancoG por el aviso.

Los problemas de WordPress con los feeds

Archivado en: Trucos, WordPress — Martín @ 13:25 06/06/2004

La noticia de ¿Trabaja Google en un buscador de blogs? en Dirson me ha hecho darme cuenta de una cosa: hay robots web (como el de Google o el de Kinja) que están buscando archivos index.xml, atom.xml o index.rdf para indexar los feeds de los weblogs. Aunque en Google simplemente parece que están haciendo pruebas, en Kinja es un hecho.

Pero WordPress no tiene ninguno de estos tres archivos, mientras que Movable Type sí los tiene (por lo menos el de RDF y RSS). Esto es así porque WordPress es totalmente dinámico, es decir, las páginas se generan en el momento de pedirlas. Pensé que la solución sería hacer que el servidor interpretase esos archivos como PHP, pero por alguna razón (quizás no esté permitido) en Bitacoras.com no se puede hacer. Después de darle vueltas, llegué a la conclusión lo mejor sería hacer que cuando alguien pidiese, por ejemplo, el archivo index.xml, se le devolviese el wp-rss2.php. Y para hacer esto nada mejor que mod_rewrite. Simplemente tenéis que añadir unas líneas a vuestro .htaccess, o crear un nuevo en el servidor. Una cosa que se debe tener en cuenta es que no en todos los servidores está disponible el mod_rewrite, pero es muy común.

Si ya estáis usando mod_rewrite para las direcciones del WordPress, basta con añadir esto:

RewriteRule index.xml wp-rss2.php [QSA]
RewriteRule index.rdf wp-rdf.php [QSA]
RewriteRule atom.xml wp-atom.php [QSA]

Si por el contrario no estáis utilizándolo, habrá que añadir todo esto:

RewriteEngine On
RewriteBase /
RewriteRule index.xml wp-rss2.php [QSA]
RewriteRule index.rdf wp-rdf.php [QSA]
RewriteRule atom.xml wp-atom.php [QSA]

Podéis comprobarlo con los feeds de mi weblog: index.xml, atom.xml e index.rdf.

WordPress 1.2 ya está aquí

Archivado en: WordPress — Martín @ 00:39 23/05/2004

Por fin la gente de WordPress ha sacado la nueva versión, la 1.2. Entre las nuevas características se destacan:

  • Subcategorías
  • Importar/Exportar OPML
  • Creación automática de thumbnails
  • Soporte para traducción
  • Moderación de comentarios
  • Envío de pings ilimitados

Yo ya estoy preparando la actualización, pero como llevo hechas tantas modificaciones a la versión actual, me llevará unos días. Además, probablemente vaya acompañado de un cambio de diseño :)

Wordpress: Cómo utilizar tildes en los títulos (II)

Archivado en: Trucos, WordPress — Martín @ 16:59 23/04/2004

Como lo prometido es deuda, aquí traigo la continuación del post de ayer. Es un pequeño script independiente, ya no una modificación para WordPress. Sencillo y rápido, veamos cómo:

  1. Creamos un archivo llamado, por ejemplo, actualizar-tildes.php, y lo guardamos con el siguiente contenido:

    <?php
    require('wp-config.php');
    $posts = $wpdb->get_results("SELECT ID,post_title,post_name FROM wp_posts");
    foreach ($posts as $titulo) {
    $id_post = $titulo->ID;
    $titulo_limpio = sanitize_title($titulo->post_title);
    $consulta = 'UPDATE wp_posts SET post_name = "' . $titulo_limpio . '" WHERE ID = ' . $id_post;
    $resultado = $wpdb->query($consulta);
    }
    ?>

  2. Subimos el archivo a la raíz de donde tengamos instalado WordPress, es decir, donde esté localizado el archivo wp-config.php. Si lo subimos dentro de algún otro directorio, no funcionará.
  3. Muy importante: hacer una copia de seguridad de todos nuestros posts. Yo he probado el script en mi weblog y he comprobado que funciona. No obstante, puede ocurrir algún imprevisto. Cualquier herramienta como phpMyAdmin nos permitirá exportar la tabla de posts (wp-posts) o la base de datos entera.
  4. Apuntamos nuestro navegador a la dirección del archivo correspondiente. Si todo ha ido bien, veremos una página en blanco, sin más. Si algo falla, obtendremos errores explicando qué es lo que falla. Repito que el script está probado y a mí me ha funcionado perfectamente. Ahora bien, puede que, por cualquier circunstancia, algo falle. Tenéis los comentarios abiertos para ello.
  5. Ya por último, nos aseguraremos de que borramos el archivo de nuestro servidor. Esto no implica un agujero de seguridad importante, pero es un poco peligroso si algún gracioso se pone a recargar ese archivo una y otra vez: puede llegar a saturar el servidor.

Después de seguir estos sencillos pasos, ya tendremos todos nuestros posts antiguos con las tildes de los títulos sustituidas adecuadamente en los enlaces.

Wordpress: Cómo utilizar tildes en los títulos

Archivado en: Trucos, WordPress — Martín @ 22:57 22/04/2004

Una de las —pocas— cosas que no me gustan de WordPress es que, si metemos vocales con tildes o eñes en un título, a la hora de generar el enlace se los come. No hay más que ver algunos de los posts de este mismo weblog: /2004/02/cunto-pesa-internet/ o /2004/02/a-quin-votar/. En estos dos casos, no parece que al leer “cunto” nos imaginemos que en realidad pone “cuánto”, y lo mismo con “quin” en lugar de “quién”. La solución es bien sencilla:

  1. En nuestro directorio de WordPress, localizamos el subdirectorio wp-includes, y dentro de éste, el archivo functions.php.
  2. Lo abrimos con nuestro editor de texto favorito (mi recomendación es TextPad), y buscamos la función que nos interesa, alrededor de la línea 87: function sanitize_title($title) .
  3. Debajo de esta declaración de función encontraremos 7 u 8 líneas más. Después de la primera, es decir, después de $title = strtolower($title);, y justo inmediatamente después (esto es importante), añadimos el siguiente código:

$title = str_replace('ñ', 'n', $title);
$title = str_replace('á', 'a', $title);
$title = str_replace('é', 'e', $title);
$title = str_replace('í', 'i', $title);
$title = str_replace('ó', 'o', $title);
$title = str_replace('ú', 'u', $title);
$title = str_replace('ü', 'u', $title);

¿Qué están haciendo exactamente estas líneas? Aun no sabiendo PHP, será fácil interpretarlas: la función str_replace busca, en la variable proporcionada en tercer lugar, la cadena especificada de primera, y la sustituye por la segunda. Así, estaremos sustituyendo en el título del post las vocales con tilde, la ñ y la ü por las vocales sin tilde, n, y u respectivamente. Luego subiremos el archivo de nuevo a su localización original, a wp-include.

Así, obtendremos enlaces más inteligibles y lógicos: en los dos casos que mencionaba antes, serían /2004/02/cuanto-pesa-internet/ y /2004/02/a-quien-votar/. Eso sí, hemos de tener en cuenta que esto sólo se aplicará a los posts nuevos. Otro día mostraré cómo recuperar las “tildes perdidas” de todos nuestros posts antiguos, sin necesidad de tener que hurgando en las bases de datos.

Wordpress: mostrar los últimos comentarios

Archivado en: Trucos, WordPress — Martín @ 19:31 06/04/2004

Para mostrar los últimos comentarios de nuestro blog en WordPress, debemos subir al servidor un archivo (ultimos_comentarios.php, por ejemplo) con este contenido:

<ul>
<?php
$path = dirname(__FILE__).'/';
require($path.'/wp-config.php');
$comentarios = $wpdb->get_results("SELECT * FROM wp_comments ORDER BY comment_date DESC LIMIT 0,5");
foreach ($comentarios as $comentario) {
$id_post = $comentario->comment_post_ID;
//$post = $wpdb->get_results("SELECT * FROM wp_posts WHERE ID = $id_post");
$autor_comentario = $comentario->comment_author;
$texto_comentario = $comentario->comment_content;
if (strlen($texto_comentario) > 50) { $texto_comentario = substr($texto_comentario,0,50) . '...'; }
echo '<li><a href="' . get_permalink($id_post) . '" title="' . $texto_comentario . '">' . $autor_comentario . '</a></li>';
}
?>
</ul>

Una vez guardado y subido, desde la página en cuestión lo llamaremos con el siguiente código:


< ?php
include('ultimos_comentarios.php');
?>

Para cambiar el número de comentarios mostrados, cambiaremos el número del final de la línea $comentarios = $wpdb->get_results("SELECT * FROM wp_comments ORDER BY comment_date DESC LIMIT 0,5");. Es decir, para mostrar los últimos 10 comentarios, en vez de 0,5, pondremos 0,10.

Para cambiar el máximo de caracteres a mostrar, cambiaremos los dos números (50 en este caso) de la línea if (strlen($texto_comentario) > 50) { $texto_comentario = substr($texto_comentario,0,50) . '...'; }. Si no queremos especificar un máximo, basta con eliminar esta línea.

Si alguien tiene alguna duda, puede dejarme un comentario.