Contenido

jpegcam, adelántate al W3C Capture API

20 dic

+ 15

Via el Tumblr de Esteban Saiz descubro jpegcam, que aunque es antigua se trata de una herramienta que aprovecha varias tecnologías para conseguir integrar una webcam en nuestro sitio web.

Como vimos hace unos días, una nueva especificación nos permitirá conseguir esto mismo desde el mismo navegador sin tener que usar Flash para activar la cámara, pero por el momento esta herramienta permitirá que vayamos disfrutando de esta posibilidad.

Instalación

La herramienta está compuesta de una serie de ficheros que debemos incluir en el directorio en el que incluyamos la aplicación:

  • webcam.js: Fichero que aporta la API con la que acceder a la cámara
  • webcam.swf: Interfaz flash que permite conectar con la cámara
  • shutter.mp3: Audio que simulará el sonido de captura de fotos.

Una vez colocados en lugar que deben estar tenemos que cargar el fichero webcam.js en nuestra página. Para ello, incluiremos el siguiente código:

<script type="text/javascript" src="webcam.js"></script>

Aunque puede ir entre los tags <head /> lo pondría al final del <body /> para aligerar un poco la carga de la página.

En este punto ya tenemos cargada la API que nos permite trabajar con la cámara, ahora nos quedará la configuración previa:

<script type="text/javascript">
 webcam.set_api_url( 'test.php' ); // Fichero de subida
 webcam.set_swf_url( '/path/to/webcam.swf' ); // Fichero SWF
 webcam.set_quality( 90 ); // Cálidad JPEG (1 - 100)
 webcam.set_shutter_sound( true ); // Activar sonido 

 // Eventos (onLoad, onComplete, onError)
 webcam.set_hook( 'onComplete', 'my_callback_function' );

 function my_callback_function(response) {
    alert("Success! PHP returned: " + response);
 }
</script>

Una vez configurado, ya podemos ponernos a usarlo. Para ello disponemos de una serie de métodos que nos permitirán generar el HTML e interactuar con las acciones que la cámara tendrá que realizar.

<script type="text/javascript">
 // Código necesario para incrustar la cámara
 document.write( webcam.get_html(320, 240) );
</script>

Con esto ya tenemos la película Flash cargada y ubicada allá donde lo hayamos puesto en nuestra página. Ahora solo nos quedará añadir los métodos para que el usuario pueda tomar la captura o configurar la cámara.

<form>
 <!-- Activamos la configuración -->
 <input type=button value="Configure..." id="configure" />

 <!-- Tomamos la imagen -->
 <input type=button value="Take Snapshot" id="capture" />
</form>
<script type="text/javascript">
 document.getElementById("configure").appendChild('click', function(){
 webcam.configure();
 }, false);

 document.getElementById("capture").appendChild('click', function(){
 webcam.snap();
 }, false);
</script>

Ya está hecho, con todo esto ya tenemos preparada nuestra página para aceptar las imágenes capturadas desde la webcam de nuestros usuarios. Solo tenemos que implementar, en el lado del servidor, la recepción de imágenes, en PHP sería algo parecido a esto:

$jpeg_data = file_get_contents('php://input');
$filename = "my_file.jpg";
$result = file_put_contents( $filename, $jpeg_data );

El script está preparado para recibir una URL y recibirla en el callback que recibirán los eventos disponibles por webcam, haciendo posible la carga asíncrona, para ello simplemente debemos pasar la URL después de haber subido el fichero.

$url = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['REQUEST_URI'])
 . '/' . $filename;
print "$url\n";

He montado un pequeño ejemplo para que me dejéis una foto de vuestra cara :D

Truco del campo oculto antispam para WordPress más fácil todavía

4 dic

+ 13

Este artículo hace ya más de un año que comencé a escribirlo y hoy que he tenido unos minutos para repasarlo y modificar un poco el código lo termino.

Hace ya mucho tiempo, Jose Ramón (Manz) publicó en Emezeta un sistema bastante ingenioso para capear el problema del SPAM en nuestros blogs.

El sistema

antispam3
(Ver Imagen)

El sistema, se basa en pensar de forma dual a la hora de implementar el formulario de comentarios de tu blog (que apartir de este momento, va a ser WordPress), y barajar la idea de que un robot pueda rellenar los campos automáticamente haciendo que sus comentarios entraran como un comentario normal. Akismet, y demás plugins antispam, tienen una gran lista de URL’s, agentes de usuarios, emails e IP’s que comprueban para comprobar que un robot es malicioso o no, pero estos sistemas, como ya bien sabemos, no son del todo eficaces. Por eso, hemos de engañar al robot :D

¿Como lo engañamos?

La propuesta de Manz, es la de añadir un campo oculto (mediante CSS) con el nombre del elemento destinado para el nombre del usuario, en el caso de WordPress usaremos author, con un valor X predefinido.

<input type="text" name="author" value="X" class="oculto" />
// CSS
input.oculto {display:none;}

Este campo, será el señuelo que los robots editarán automáticamente al procesar la página, principalmente por que es un <input /> y además se llama author, lo que hace complicado saber si esa página lo tiene implementado o es una trampa.

Para los usuarios, incluiremos un nuevo elemento <input /> con un nombre a nuestra elección.

<input name="nombrebueno" type="text" class="author" />

El usuario, verá este campo y será en el que introducirá su nombre de usuario. A simple vista podemos ver el problema que nos encontramos al realizar este cambio, el nombre del usuario siempre será X, ya que WordPress está preparado para leer author como nombre de usuario, y evidentemente no conoce el campo nombrebueno que hemos creado nosotros.

Por este motivo hemos de modificar el código de WordPress para añadir unas pocas líneas (voy a explicar como lo tenía yo antes de implementar la funcionalidad que veremos abajo):

wp-config.php
define("SPAM_CONTROL", "kaminitos"); // No sé por que puse eso...
wp-comment-post.php
$comment_author       = ( isset($_POST['author']) )  ? trim(strip_tags($_POST['author'])) : null;
$comment_author_email = ( isset($_POST['email']) )   ? trim($_POST['email']) : null;
$comment_author_url   = ( isset($_POST['url']) )     ? trim($_POST['url']) : null;
$comment_content      = ( isset($_POST['comment']) ) ? trim($_POST['comment']) : null;

// Añadimos el control del campo nuevo
if ($_POST["author"] != SPAM_CONTROL) die("SPAM");
$comment_author       = ( isset($_POST['secure']) )  ? trim(strip_tags($_POST['secure'])) : null;

Se puede hacer más sencillo, editando únicamente el fichero wp-comment-post.php, pero de esta forma tengo control sobre lo que aparece en el campo oculto.

Evidentemente, este sistema, me obliga a añadir esas dos líneas de código cada vez que actualizo WordPress, lo que se convierte en algo, que aunque no es laborioso, es muy pesado. Para evitar tener que modificar el código de WordPress en cada actualización, yo propongo este código.

Sistema antispam de campo oculto más cómodo :D

// Mensaje que mostramos a los SPAM
define('MESSAGE', 'SPAM!!!');
// Nombre del campo que usaremos para alojar el verdadero nombre del usuario
define('NOMBRE_CAMPO', 'secure');
// Clave única que será modificada por el bot
define('WP_ANTI_SPAM', 'kko');

add_filter('pre_comment_author_name', '_pre_comment_author_name');
function _pre_comment_author_name($comment_author_name = ''){
 // Devolvemos el nombre del autor sinó estamos pasando los campos necesarios
 if (!isset($_POST['author'], $_POST[NOMBRE_CAMPO])) return $comment_author_name;

 // Matamos el proceso
 if (isset($_POST['author']) && $_POST['author'] != WP_ANTI_SPAM) die(MESSAGE);

 // Cambiamos el nombre del author
 global $wpdb;
 return $wpdb->escape(trim(strip_tags($_POST[NOMBRE_CAMPO])));
}

function get_anti_spam_input($comment_author){
 return '<input type="hidden" name="'.NOMBRE_CAMPO.'" value="'.esc_attr($comment_author).'" />';
}

function anti_spam_input($comment_author){
 echo get_anti_spam_input($comment_author);
}

function get_author_input($comment_author){
 return '<input type="hidden" name="author" value="'.WP_ANTI_SPAM.'" />';
}

function author_input($comment_author){
 echo get_author_input($comment_author);
}

Este código, lo incluimos en el fichero functions.php de nuestro theme. Como vemos en la parte superior, tenemos 3 define() que nos permiten declarar 3 variablesconstantes que nos hará nuestro sistema más personalizable. Después, vemos una función que se aplica al filtro pre_comment_author_name en la que comprobamos que el campo oculto no ha sido modificado. En caso de detectar el cambio, matamos el proceso en ese mismo momento, mostrando el mensaje que hayamos definido previamente.

En caso de que el campo oculto no haya sido modificado, entonces reemplazaremos el nombre de usuario por el del campo visible para el usuario. Este sistema nos permite intercalar este proceso y hacer que en caso comentario válido, continúe sin ningún problema.

Modificar el theme

Después para facilitar el trabajo de modificación del theme, he añadido unos métodos para pintar (o devolver como cadena) los elementos <input /> que intervienen en este sistema. Usaremos, como siempre, el theme default de WordPress, y usaremos únicamente el fichero comment.php del mismo.

Básicamente, el único cambio que tendremos que realizar es el cambio de esta línea:

<input type="text" name="author" id="author" value="<?php echo esc_attr($comment_author); ?>" size="22" tabindex="1" <?php if ($req) echo "aria-required='true'"; ?> />

Por estas dos

<?php
 author_input($comment_author);
 anti_spam_input($comment_author);
?>

Estos dos funciones se encargarán de pintar los elementos <input /> que vamos a necesitar. Evidentemente, si tu theme tiene estilos o clases aplicados a estos elemento tendrás que modificarlos en las funciones get_anti_spam_input() get_author_input() del fichero functions.php que hemos incluido antes.

Sencillo, ¿verdad? :D

Resultado

El resultado, os puedo garántizar que es 100% satisfactorio y que junto a Akismet el SPAM (por el momento) deja de ser un problema.

La funcionalidad “post-image” de WordPress 2.9

17 nov

+ 13

Una de las nuevas funcionalidades que nos encontraremos en WordPress 2.9 es el llamado post-image, que como ya hemos explicado previamente se trata de un sistema que nos permite asociar a un post una imagen y poder usarla en un theme.

Justin Tadlock muestra un completo artículo mostrando como hacer uso de esta funcionalidad.

1) Permitir la funcionalidad

Como vimos en el post de las nuevas funcionalidades de WordPress 2.9, el theme iba a coger algo de relevancia permitiendo activar/desactivar funcionalidades de WordPress desde el fichero functions.php.

Esta capacidad nos permitirá activar esta funcionalidad añadiendo un simple línea a nuestro theme:

add_theme_support( 'post-thumbnails' );

Esta línea, nos activará la funcionalidad de post-image en nuestro WordPress, permitiendo que podamos ver un box más en nuestra página de “Nueva Entrada”.

wordpress-2.9-post-image
(Ver Imagen)

Allí podremos seleccionar una imagen que será asociada al post.

2) Usar la funcionalidad

Una vez asociada la imagen, ya solo nos queda hacer que nuestro theme muestre la imagen donde queramos. Para ello tenemos una serie de funciones que debemos conocer:

the_post_image($size)

Esta función nos permite mostrar la imagen en el punto en el que la llamamos, requiere estar incluida dentro del Loop para funcionar.

<?php while( have_posts() ) : the_post(); ?>
 <div>
 <h1><a href="<?php the_permalink() ?>"><?php the_title() ?></a></h1>
 <?php the_post_image() ?>
 <?php the_content() ?>
</div>
<?php endif; ?>

Podemos usarla con un parámetro para especificar el tamaño de la imagen que queremos mostrar:

  • thumbnail
  • medium
  • full

Todas hacen referencia a la configuración de imagenes del apartado Opciones > Media de nuestro panel de control.

has_post_image()

Para comprobar si un post tiene asociada una imagen deberemos usar has_post_image() que nos devolverá true o false.

<?php
	if ( has_post_image() )
		the_post_image( 'thumbnail' );
	else
		echo '<img src="default-image.png" alt="Example Image" title="Example" />';
?>

get_post_image_id()

Si necesitamos obtener el ID de la imagen podremos hacer uso de esta función que nos devolverá el ID.

$image_id = get_post_image_id();

get_the_post_image( $id, $size )

Si necesitamos obtener la imagen de un post fuera del Loop podemos acceder directamente a ella indicándole el ID del post y el tamaño de la imagen que necesitamos.

$image = get_the_post_image( $post->ID, 'thumbnail' );

3) Filtros y actions

Además de las funciones que nos permiten trabajar cómodamente con la imágen asociada, tenemos una serie de filtros que nos permiten personalizar más aún la funcionalidad y obtener resultados de lo más dispares.

//Filters
 - post_image_size
 - post_image_html
// Actions
 - begin_fetch_post_image_html
 - end_fetch_post_image_html

Veamos un ejemplo de Justin nos muestra con el que podemos cambiar el HTML de salida de la imagen que vamos a mostrar.

add_filter( 'post_image_html', 'my_post_image_html', 10, 3 );
function my_post_image_html( $html, $post_id, $post_image_id );
	$html = '<a href="' . get_permalink( $post_id ) . '" title="' . esc_attr( get_post_field( 'post_title', $post_id ) ) . '">' . $html . '</a>';
	return $html;

}

Se trata de una gran funcionalidad, que muchos desarrolladores de themes estarán deseando usar en sus creaciones.

Wp-Answers, crea una comunidad de preguntas y respuestas con WordPress

7 nov

+ 77

Hace unos meses empecé a montar este plugin que permite crear comunidades basadas en preguntas y respuestas, al estilo StackOverFlow y/o Yahoo! Answers. La idea es generar, sin modificar para nada el núcleo de WordPress, un sistema basado en votaciones de comentarios y ordenarlos por este número de votaciones.

De esta forma, podremos disponer de un sistema que nos permita lanzar preguntas y que mediante las contestaciones de los usuarios y sus votos, podamos obtener una respuesta lo más acertada posible.

Wp-Answers

El plugin se encarga de añadir un formulario a cada comentario permitiendo que los usuarios puedan votar positiva o negativamente dicho comentario. Posteriormente y dependiendo del número de comentarios de este comentario y los demás, lo ordenará de forma que el comentario con más votos quede primero, el segundo mejor votado segundo y así sucesivamente.

wp-answers
(Ver Imagen)

Nuestro theme

El plugin, está pensado para no depender de ningún theme y que pueda funcionar en cualquiera, por ello todo el estilo CSS y el Javascript (para realizar las llamadas con Ajax) se puede añadir fácilmente adaptándolo a cada WordPress.

Dándole estilos

El formulario, por defecto no tiene estilos aunque puede personalizarse como más nos guste incluyendo los estilos a nuestro style.css de nuestro theme. Os dejo un ejemplo del que he usado para las pruebas:

.wp_answers_votes {
 float:right;
 background-color:#F1F1F1;
 margin-bottom:10px;
 padding:10px
 text-align:center;
 -moz-border-radius:6px;
 -webkit-border-radius:6px;
 border-radius:6px;
}
.wp_answers_total_votes{
 font-size:2em;
}

Opciones

Disponemos de una serie de opciones, muy sencillas que nos permiten configurar el nivel de Karma que aporta o resta la votación de comentarios. Además de poder indicar si necesitamos que el usuario este registrado en el blog o no.

wp-answers-options
(Ver Imagen)

Widget

He creado un pequeño Widget que nos permitirá mostrar un top N usuarios, ordenados por karma acumulado en nuestro sidebar, simplemente tendremos que indicar las opciones del Widget y añadirlo al sidebar que deseemos.

wp-answers-widget
(Ver Imagen)

Descargar

Aquí teneis el enlace, también podeis verlo en funcionamiento con el theme P2 (de WordPress)

Actualización

Por sugerencia de Cristian Eslava añado la opción de seleccionar una categoría a la que asociar este sistema de mostrar los comentarios. De esta forma, es posible asociarlo a una parte de tu WordPress y no a todo.

Excerpt2Content, muestra todo el contenido a tus usuarios

4 nov

+ 12

Muchos son los mails que he recibido pidiendome una solución al problema de que el theme de su WordPress muestra solo una pequeña porción del contenido. Esto es debido a que el theme que están usando está haciendo uso de la función the_excerpt() en lugar de the_content().

La diferencia es que la primera nos muestra únicamente el extracto del artículo, sino lo hemos redactado este cogerá las primeras 55 palabras (por defecto) del artículo, eliminando tags HTML como <img />, <strong />,… haciendo que el contenido tenga un aspecto de “extracto” del original. Generalmente este contenido está seguido de unos puntos suspensivos indicando que el artículo no está completo ([...]). Lo que hace que el usuario tenga que acceder a leer el artículo directamente para ver el contenido completo.

Por otro lado, the_content() nos muestra el contenido completo y nos permite cortarlo donde queramos mediante el uso de 2 tags:

  • <!--more-->: Añade un texto de “Leer Más” (que puedes cambiar) al final de la página principal y que te lleva al artículo completo.
  • <!--nextpage-->: Te permite generar una paginación y cada tag generará una página nueva.

anieto2k_excerpt
(Ver Imagen)

Muchos themes traen the_excerpt() por defecto, ya que la teoría dice (y la práctica lo demuestra) que al mostrar parte del contenido, el usuario genera un mayor número de páginas vistas (una de la página principal y una por cada noticia que quiere ver completa) pero en muchos casos quieres mostrar imágenes o simplemente no quieres que el usuario tenga que acceder a ver un post completo para leer toda la noticia, en estos casos tenemos varias soluciones.

1) Reemplazar the_excerpt() por the_content()

La primera solución sería la de buscar en el theme que estamos usando la palabra the_excerpt() y reemplazarla por the_content() haciendo que siempre se muestre el contenido.

2) Añadir filtro a the_excerpt()

Otra solución más sencilla y fácil de deshacer sería la de añadir un pequeño (muy pequeño) filtro a la llamada the_excerpt() para hacer que nos devuelva el contenido completo.

function excerpt2content(){
 return get_the_content();
}
// Añadimos excerpt2content al filtro
add_filter('get_the_excerpt', 'excerpt2content');

Este código, puede ir alojado en el fichero functions.php del theme y si queremos volver al estado inicial, simplemente tendremos que eliminar estas 4 líneas para volver a la normalidad :D

Ordenar artículos por orden de comentarios más recientes

2 nov

+ 1

En Stackoverflow descubro un sistema sencillo para ordenar nuestros posts por orden de comentarios más recientes. Esto nos permitirá mostrar los últimos artículos en los que hay actividad.

<?php

$query = 'select wp_posts.*, max(comment_date) as comment_date
 from $wpdb->posts wp_posts
 right join $wpdb->comments
 on id = comment_post_id
 group by ID
 order by comment_date desc
 limit 10';

$results = $wpdb->get_results($query) or die('!');
foreach ($results as $result):

?>
[Aquí el template del post]
<?php endforeach ?>

Una interesante forma de mostrar de una forma dinámica por parte de la interacción de los usuarios los posts que han sido comentados recientemente.

rewind_posts, reiniciando nuestro Loop

24 oct

+ 6

Una de esas funciones que nos ayudan a hacer más fácil nuestro trabajo con WordPress es rewind_posts(), y aunque su uso no es muy común, en alguna situación podemos alegrarnos de conocerla.

rewind_posts()

<?php
 query_posts('....');
 while (have_posts()) : the_post();
 ...
 endwhile;

 // Reiniciamos los posts
 rewind_posts();

 // Nueva query_posts()
 query_posts('....');
 while (have_posts()) : the_post();
 ...
 endwhile;
 ?>

Está función, disponible como método de WP_Query, es la función encargada de reiniciar el Loop de WordPress para poder usarlo complementamente vacio despues de llamar a esta función. Ideal para el uso de varios Loops en una misma página.

9 aplicaciones microblogging completamente Open Source

20 oct

+ 14

Los blogs y las prisas dieron lugar a una tendencia llamada microblogging, que básicamente se trata de generar “blogs” especializados en pequeños posts. Similar a lo que hacemos con Twitter o Tumblr, estas aplicaciones nos permiten compartir con Internet nuestras pequeñas ideas, enlaces encontrados,….

Implementar un sistema de estos es muy sencillo, y con estas herramientas aún es más sencillo :D

  • StatusNet: Desarrollado en PHP + MySQL
  • Yonkly: Desarrollado en ASP.Net
  • JaikuEngine: Desarrollado en Python
  • Floopo: Desarrollado en PHP + MySQL
  • Jisko: Desarrollado en PHP + MySQL y compatible con dispositivos móviles por defecto.
  • PageCookery: Desarrollado en PHP + MySQL con un interface enriquecido por Ajax.
  • EchoWaves: Desarrollado en Ruby and Rails.
  • P2 WordPress Theme: Theme para WordPress que convierte tu WordPress en un microblog.
  • Motion: Desarrollado en Python sobre Django.
  • Blurt.it: Desarrollado en PHP + MySQL.

CssDispatcher, maneja tus CSS como un profesional

11 oct

+ 5

Isra, nos muestra una librería en PHP que ha desarrollado para ayudarnos a trabajar con CSS de una forma muy cómoda y profesional.

$styles = new CssDispatcher; 

$styles->add(new Css('ie-hacks.css.php'));
$styles->add(new Css('general.css.php')); 

$styles->render();

CssDispatcher, se encarga de procesar los ficheros .css permitiendo así que podamos incluir código PHP en nuestras hojas de estilos, además de unir y comprimir todas las hojas de estilo que necesitemos en nuestro proyecto.

$styles = new CssDispatcher; 

// Este CSS solo se enviará cuando sea Internet Explorer 6
$styles->add(new Css('ie-hacks.css.php', Css::UA_IE6));
$styles->add(new Css('general.css.php')); 

$styles->render();

Además, nos permite condicionar nuestro CSS dependiendo del navegador que nos visita. De esta forma, podemos cargar un fichero, o no, dependiendo si el navegador que nos visita es el especificado previamente.

Twig, un flexible, potente y seguro motor de plantillas en PHP

9 oct

+ 4

Twig es un motor de plantillas pensado para ofrecer una opción seguro y potente, aportando un flexibilidad muy interesante a nuestras plantillas. [Documentación][Descargar]