Por @Alvy — 17 de Mayo de 2005

He preparado va una explicación rápida pero completa, a modo de HOWTO («Como hacer...») sobre cómo está programado el enlace ¡Salta! que tenemos en el menú de navegación de la parte superior de la página, cuyo efecto es sencillamente saltar a una anotación cualquiera dentro de Microsiervos, completamente al azar. Esta explicación es bastante general y podría servir para cualquier sistema de weblogs, o cualquier site con muchas páginas distintas en general, siempre que puedas identificar de forma única cada página (y extraer una lista de todas las URLs que tienes) y ejecutar PHP.

Actualización: Si usas Movable Type, a raíz de una excelente sugerencia de Julio Alonso y con un bug detectado por Estaban existe un código mucho más corto y elegante, que he llamado Random Post Hyperjump! v2.0.

Actualización (19 de mayo de 2005): J. Francisco de Todo lo que nunca quisiste saber ha utilizado el código original para crear Salta! para WordPress con un código breve que hace una llamada a la base de datos, de modo que tampoco hace falta pre-generar la lista de URLs.

Cómo saltar a páginas web al azar en PHP

  1. Se trata de un script muy sencillo programado en PHP, de modo que lo primero que necesitas es que el sitio en donde tienes alojada las páginas permita usar PHP y subir ficheros. Esto lo puedes consultar con tu proveedor, en general casi cualquier alojamiento de pago está permitido, en los gratuitos no es tan común pero algunos lo tienen - a veces incluso puedes usar la opción de «subir fotos» para subir el fichero PHP. Un truco si no tienes PHP es poner esta página en otro alojamiento donde sí admitan PHP, porque en realidad da igual dónde se ejecute.
  2. Lo primero que necesitarás es una lista de todas las URLs a las que quieres que se pueda «saltar», porque el script funciona a partir de una larga lista de opciones, eligiendo una al azar (no accede a la base de datos de contenidos). Muchos sistemas de contenidos para crear weblogs generan ficheros «estáticos» HTML individuales, como Movable Type o Blogger. Da igual si los genera como números (ej. 0001.html, 0002.html, etc.) o con nombres, y si lo hace con o sin directorios (ej. archivos/ciencia/sputnink.html) mientras puedas obtener esa lista de archivos individuales. Será una lista como por ejemplo: http://www.microsiervos.com/archivos/foo.html http://www.microsiervos.com/archivos/bar.html http://www.microsiervos.com/archivos/xyz/blah-blah.html
  3. Hazte con esa lista de archivos y cópiala en cualquier editor de texto, una dirección en cada línea. En mi caso utilicé mi programa FTP para revisar todos los directorios en los que están los archivos individuales, fui copiando-y-pegando esa lista. Luego quité lo que sobraba (el ftp://xyz.com/.... En casi todos los sistemas de blogs se usa un directorio como /archivos/ para guardar las anotaciones individuales, a veces están todos en el mismo directorio, a veces en directorios por categorías. Si tienes acceso por consola puedes moverte por los directorios y hacer un ls y copia-pega, o tal vez obtener los nombres completos de archivo de algún lugar de tu sistema de contenidos (el log tal vez). El caso es terminar con un fichero donde están todas las URLs de tus anotaciones individuales. (Nota: naturalmente, necesitarás refrescar esta lista de vez en cuando porque el script no lo va a hacer sólo.)
  4. Creas un archivo para el script con el nombre que prefieras, que acabe en .php, en el caso de este weblog se llama microsiervos-al-azar.php con este script:

    <php
    // Random Post Hyperjump! v1.0
    // by Alvy for http://www.microsiervos.com
    // License is granted if this attribution is fully included

    $urls = array (
    'foo.html',
    'bar.html',
    'xyz/blah-blah.html',
    );

    $site = «http://www.microsiervos.com/archivo/»;
    $i= rand(0,count($urls));

    header («Location: $site$urls[$i]»);
    ?>

  5. Como se ve el script es muy sencillo, sólo son tres líneas en realidad: definir una matriz ($urls) que contendrá todas las URLs de las páginas, definir otra con la trayectoria completa de la zona en que están esos archivos ($site), elegir una de las URLs al azar ($i) y finalmente hacer un salto usando header location.

  6. En el archivo previo en el que tienes tu lista de URLs, y elimina lo que esté repetido (generalmente, el http://www.xyz.com/archivo/) porque no será necesario. Ten en cuenta que el script encadena lo que definas como «nombre del sitio web» en la variable $site con las cadenas de las URLs, fíjate en las barras de separación de los directorios especialmente.

  7. Añade las comillas (') de inicio y final a cada línea, y una coma antes del retorno de carro. Normalmente en tu editor de texto existirá una función para «añadir al principio de línea» o «al final de línea». Otro truco es hacer un Buscar y Reemplazar, por ejemplo se puede buscar (\r) (un retorno) y reemplazarlo por (',\r') (comilla coma retorno comilla)
  8. Copia y pega la lista de URLs con el formato adecuado dentro del script PHP que contiene el código principal

  9. Sube el script por FTP o el método que suelas usar a tu weblog. Ya lo puedes enlazar desde el menú. Pruébalo a ver qué tal funciona.

  10. Importante: Como no querrás confundir a Google y otras arañas buscadoras de la red con un enlace a un sitio que redirije a una página distinta cada vez, recuerda siempre hacer dos cosas: (A) Cuando enlaces a esa página, añade el parámetro rel=«nofollow» para que los robots no la sigan, enlazándola así: <a href="/microsiervos-al-azar.php" rel="nofollow">; (B) Añade por si acaso una línea de exclusión a tu fichero robots.txt en el directorio principal de tu site (o créalo si no lo tienes), indicando que nunca indexen ni sigan esa página PHP, con esta instrucción:

    Disallow: /microsiervos-al-azar.php

    (utiliza el nombre de archivo que hayas elegido).


  11. Aunque la lista de URLs sea enorme, el fichero de texto será pequeño y se procesará muy rápido. En el ejemplo de Microsiervos, tiene más de 1.500 URLs y ocupa sólo 50 KB, eso en realidad el usuario ni lo nota porque el PHP lo pre-procesa antes de enviárselo al usuario, en una fracción de segundo.
Bueno, así es como funciona el sistema tal y como está programado en este blog (una progamación rápida en cinco minutos, la verdad). Seguramente habrá otras formas de hacerlo, más o menos flexibles, más o menos elegantes. Esta es práctica para lo que necesitaba (saltar al azar a cualquier anotación antigua) con muchas URLs distintas y sin tener que acceder a la base de datos de contenidos. Tiene la desventaja de que de vez en cuanto tienes que actualizar esa lista para que esté al día - lo cual si tienes cientos tampoco es un gran problema, lo puedes hacer una vez al mes tal vez. Funcionaría incluso con URLs de distintos weblogs si te apetece. Si se te ocurre alguna mejora o alternativa, déjanos un mensaje en los comentarios.

Compartir en Flipboard  Compartir en Facebook  Tuitear

30 comentarios

#1 — rvr

Je, qué recuerdos. Uno de mis primeros CGIs, hechos en C, fue precisamente un redireccionador aleatorio (de páginas de astronomía, claro).

#2 — Alvy

Je, ese es mi segundo script en PHP así que sed misericordiosos... ;-) A ver si aprendiendo aprendiendo llego tan lejos como vos... ;-))))))

#3 — morri

Muchas gracias, cuando llegue a casa y tenga tiempo lo intento hacer. A ver si saco un ratillo ;)

#4 — AL

Como dices, lo menos elegante es tener que actualizar la lista de URLs a manopla.

Una función "dir" sobre vuestra carpeta "archivo" que filtre para quedarse con los de extensión .html podría valer.

Se puede usar el código de los comentarios de la sección Funciones de Directorio de PHP.

Hastaluego,

#5 — Julio Alonso

Alvy,

En MT puedes usar una plantilla para que te genere el listado de URLs de tus archivos y no tener que ir pescándolas por los directorios. De hecho, todo el script puede ser el output de una plantilla índice.

#6 — Alvy

El truco de #4 es bueno, hoy Jab nos comentó en persona que otra forma de evitar tener que sacar los contenidos a manubrio sería hacer una query a la base de datos de contenidos eligiendo un registro al azar, y otra haciendo desde el PHP una especie de 'dir' o 'ls' y quedándote procesando el resultado...

... PERO la solución de Julio #5 en Movable Type (probablemente para otros sistemas sea similar) es realmente la más ingeniosa y mata TODOS los pájaros de un tiro: puedes hacer que esa plantilla se regenere cada vez que creas un post nuevo (espero que no sea muy lento, si no bastaría republicarlo a mano de vez en cuando), puedes tener todos los nombres de archivo ya publicados correctamente, etc. También si quieres añadir otras URLs que no correspondan al post podrías añadirlas a mano... y Además puedes darle como fichero de salida a esta plantilla el propio nombre de archivo /salto-al.azar.php y siempre estará actualizado.

Es una solución completa y elegante, se puede resolver en unas pocas líneas más... así que voy a probarla y os paso cómo quedaría... ¡Gracias Julio!

#7 — Alvy

OK, el código [para una plantilla de Movable Type] entonces sería este:

...

<?php

// Random Post Hyperjump

// v2.02 for PHP and Movable Type

// by Alvy for http://www.microsiervos.com

// improved with an idea by J. Alonso http://www.merodeando.com

//

// License is granted if this attribution is fully included

$urls = array (

<MTEntries lastn="99999">

'<$MTEntryPermalink$>',

</MTEntries>

);

$go= $urls[rand(0,count($urls)-2)];

header ("Location: $go");

?>

...

Recapitulando en plan paso a paso: (1) Hay que generar una plantilla en TEMPLATES > INDEX TEMPLATE (2) en el apartado OUTPUT FILE de esa plantilla hay que llamarlo como quieras llamar al archivo (en mi ejemplo: microsiervos-al-azar.php (3) importante, NO hay que poner nada en LINK THIS TEMPLATE... (4) Se puede marcar el [x] Rebuild this template... para que se regenere con los demás índices o no hacerlo y reconstruir de vez en cuando manualmente.

Notas: El lastn=99999 es para que salgan todos los posts posibles, se puede limitar por otros parámetros (por días, etc.) pero este valor es OK si quieres todos los posts.

¡Gracias Julio!

#8 — Esteban

Alvy, de todos modos cuidado con la función rand() como la estás utilizando.

Esta función te va a dar un aleatorio entre el 0 y el total de elementos del array (3 en el ejemplo), pero como seguro que sabes, el array tiene 3 elementos, pero el último índice es el 2 (0,1,2) por lo que cuando el valor de $i sea 3, no mostrará ninguna URL y te llevará la la URL definida por defecto en $site.

Más info: http://es.php.net/rand

#9 — Alvy

Aha, entonces le ponemos un -1 para que salga bien.

#10 — Alvy

Quiero decir, un rand entre 1 y el numero de elementos, aunque el ultimo acaba en , así que debe ser uno vacío... mmm lo chequearé, así parece que funciona. En nuestro MT está generando como 1600+ URLs correctamente.

#11 — Alvy

mmm que lío, debería ser entonces

$go= $urls[rand(0,count($urls))-2];

es decir, entre cero y el numero de elementos -1 pero -1 extra porque el último está vacío (es decir, -2)

#12 — Esteban

Alvy (parezco un pesado)... he visto otro pequeño bug.

La resta de 2, debe de hacerse dentro de la función count() ya que es ahí donde limita por el final el total de items de array.

En vez de:

$go = $urls[rand(0,count($urls))-2];

Debería de ser:

$go = $urls[rand(0,count($urls)-2)];

#13 — Alvy

cierto cierto, gracias!

#14 — morri

Quizá para Blogger también se puede hacer el nuevo truco, lo intentaré ;)

#15 — WhisKiTo

Entonces, podria copiar ese cacho de codigo e implementarlo en mi blog de blogger?

#16 — Alvy

En blogger te va a pasar que si no puedes cambiar el sufijo .html por .php (que no creo) entonces no hay manera... Tal vez renombrando todas las URLs acabadas en .php aunque eso puede ser un poco lío.

#17 — Alvy

Además en blogger la plantilla a menos que haya cambiado bastante juraría que es única (a menos que quieres usar la plantilla de 'archivos') y no habría manera... al menos no fácil.

Pero se puede usar el truco normal (el original que he descrito en el post) para Blogger o cualquier otro sistema de publicación, si te haces previamente el listado manual de todas las URLs.

#18 — WhisKiTo

Yo ahora he cambiado la "plantilla" de blogger y he modificado la interfaz (el "template").

Pero, Blogger no te ofrece un espacio web, aunque de esto tengo yo a patadas por ahi.

Valdria usar un espacio web que no pertenezca a blogger?

¿?¿?

#19 — morri

Sí Alvy, yo lo decía por no tener que cogerlas a mano que debe ser un palazo, debo de tener 800 posts... A mano me puede dar algo, pero un dia que tenga un rato libre lo hago porque es muy guapo esto del salta! jejeje

#20 — Alvy

#18 siempre que admita PHP sí, y entonces en Blogger no tienes que cambiar nada, exccepto poner un enlace a tu página de salta

#19 a mano es entrar por FTP o por consola en el directorio del site y listarlo y hacer copy paste realmente, 2 minutos

#21 — Julio Alonso

Alvy, gracias por la atribución en el código. Es la primera vez que aparezco en los créditos de algo de soft aunque sea un script simple y elegante :)

#22 — Alvy

¡Es divertido programar entre varios aunque sea una chorrada de script como este! ¡¡Y esa aportación era buenísima!!

#23 — alidhaey

Programación colaborativa en los comentarios de un blog. ¿Bajo que licencia esta el desarrollo?

#24 — Alvy

pues busqué algo tipo Creative Commons y GPL etc y me pareció muy complejo!! por eso puse lo de "licenciable con sólo mantener la cita de atribución" que es lo mismo que he visto en muchos scripts que hay por ahí circulando. En otras palabras: cópiatelo si quieres, pero deja intacta la mención a la fuente original

#25 — sosa

hace tiempo usé un script parecido para hacer un blogroll aleatorio en el blog de un aamiga, chequenlo www.nolimit-studio.com/lafamosax

#26 — Franc

Con mis casi nulas habilidades he puesto un script basado en Salta!, pero para Wordpress :D

Saludos!

#27 — Alvy

Genial, ¡felicidades!

#28 — jhonny

calida

#29 — superporcel

Aqui explico como hacerlo con Textpattern.

#30 — ... hmmm ...

He creado un script para WordPress, pues la versión que hizo J. Francisco de "Todo lo que nunca quisiste saber" no funciona correctamente en muchos casos.

Salta para WordPress