Oct 09

Los títulos de las páginas son uno de los factores más importantes de cara a la optimización de un sitio web para los buscadores (SEO). Si tenemos un blog con WordPress la responsabilidad de tener unos buenos títulos recae en el archivo header.php de nuestro tema. El tema por defecto de WordPress (Kubrick), y la mayoría de themes que corren por ahí, generan unos títulos no muy buenos para el posicionamiento, a continuación describo una manera fácil de solucionar esto sin necesidad de ningún plugin.

Se trata de sustituir el código para los Title Tags que normalmente será algo parecido a esto:

<title><?php bloginfo('name'); ?> <?php if ( is_single() ) { ?> &raquo; Blog Archive <?php } ?> <?php wp_title(); ?></title>

por esto si tenemos WordPress 2.3:

<title><?php
if (is_archive()) echo 'Archivo de ';
if (is_tag()) echo 'etiquetas de ';
echo trim(wp_title('',false));
if (is_search()) echo 'Resultados de b&uacute;squeda de '.$s;
if ( !(is_404()) and (is_search()) or (is_single()) or (is_page()) or (is_tag()) or (is_archive()) ) echo ' en ';
bloginfo('name');
if ( is_home() ) { echo ' &raquo; '; bloginfo('description'); }
?></title>

o por esto si tenemos versiones anteriores:

<title><?php
if (is_archive()) echo 'Archivo de ';
echo trim(wp_title('',false));
if (function_exists('is_tag') and is_tag()) echo 'Archivo de etiquetas de '.$tag;
elseif (is_search()) echo 'Resultados de b&uacute;squeda de '.$s;
if ( !(is_404()) and (is_search()) or (is_single()) or (is_page()) or (function_exists('is_tag') and is_tag()) or (is_archive()) ) echo ' en ';
bloginfo('name');
if ( is_home() ) { echo ' &raquo; '; bloginfo('description'); }
?></title>

Con esta modificación conseguimos los siguientes tipos de títulos:

  • En la home: "NOMBRE_DEL_BLOG » DESCRIPCIÓN_DEL_BLOG"
  • En las categorías: "Archivo de NOMBRE_CATEGORÍA en NOMBRE_DEL_BLOG"
  • En las etiquetas: "Archivo de etiquetas de NOMBRE_ETIQUETA en NOMBRE_DEL_BLOG"
  • En los resultados de búsqueda: "Resultados de búsqueda de TEXTO_BUSCADO en NOMBRE_DEL_BLOG"
  • Para todos los posts y páginas: "TÍTULO_ENTRADA en NOMBRE_DEL_BLOG"

Lo anterior está extraido del tema K2, traducido al español y con algún retoque. Podría haber hecho un plugin, pero es tan sencillo y como igualmente sería necesario modificar el tema para llamar al plugin, que mira, modificas el tema y directamente introduces el código de lo que sería el plugin.

Si quieres tomarte más en serio la generación de los títulos o si eres perezoso existen plugins muy avanzados como SEO Title Tag y All in One SEO Pack, este último también sirve para gestionar los Meta Tags "description" y "keywords" también muy importantes para SEO pero no tanto como los Title Tags.

Etiquetas:
Jul 12

Hace un par de días anunciaron en el blog de las PEAR la disponibilidad de un nuevo estándar donde se describen los cambios necesarios en las reglas de las PEAR para hacer frente, entre otros requisitos, al nuevo instalador Pyrus y a la nueva característica unzip-and-go de las PEAR2. Desde el post se llama a la participación en la página de discusión de la wiki.

Se tratan temas como la estructura de directorios, nombres de archivos y clases, dependencias entre clases, como trabajar con el repositorio, etc.

En la misma wiki puedes ver una lista completa de los problemas q este nuevo estándar quiere solventar. Es realmente interesante la nueva característica unzip-and-go de las PEAR2, permite a quien quiera usar sólo una o dos clases PEAR se las pueda descargar y utilizar directamente sin necesidad de usar el instalador.

Vía PEAR Blog

Etiquetas:
Jun 18

Del.icio.us, el archiconocido servicio de gestión de marcadores sociales, ofrece una API para poder desarrollar aplicaciones que utilicen sus servicios. Hace tiempo que vi aparecer la clase Services_Delicious en el repositorio de las PEAR pero hasta ahora no le había podido pegar un ojo, es una clase que implementa un cliente para los servicios web basados en REST de del.icio.us.

La Transferencia de Estado Representacional (Representational State Transfer) o REST describe una interfaz web simple utilizando peticiones HTTP y datos XML pero sin capas adicionales como SOAP, frecuentemente usadas en los servicios web. Precisamente el otro día estuve charlando con mi colega Manuel Aguilar acerca de las ventajas de usar servicios REST en muchos escenarios frente a los clásicos servicios web basados en SOAP o basados en protocolos propios, tema que se trato en la pasada PHP Conference 2007 spring edition celebrada en Stuttgart a la que Manuel asistió.

Sin ánimo de entrar en más detalles de lo que es REST (puedes consultar la definición de la wikipedia que enlazo, está muy bien) vamos a ver como trabajar con del.icio.us desde PHP usando la clase Services_Delicious.

Services_Delicious es una clase todavía en fase beta que no implementa todo lo que nos ofrece el servicio web de del.icio.us, pero que ya permite hacer todas las operaciones básicas cómodamente, como guardar y borrar enlaces, listar los tags, cambiarles el nombre, etc. Son poco más de 400 lineas bastante bien escritas, aunque en PHP4, donde se utiliza HTTP_Request para realizar las peticiones HTTP y XML_serializer para trabajar con los datos XML.

A continuación describo como hacer una nube de tags de una cuenta determinada de del.icio.us y como guardar un nuevo enlace. Esto son sólo dos ejemplos de utilización de algunas de las funciones que nos proporciona Services_Delicious, puedes ver todas las funciones disponibles en el siguiente listado:

  1. getTags()
  2. renameTag($old, $new)
  3. getDates()
  4. getPosts($tags, $date)
  5. getRecentPosts($tags, $max)
  6. getAllPosts()
  7. addPost($url, $description, $extended, $tags, $date, $shared)
  8. deletePost($url)

Instalación de Services_Delicious

Asumiendo que tenemos las PEAR disponibles lo primero que hemos de hacer es instalar la clase en cuestión:

$ pear install --onlyreqdeps Services_Delicious-beta

Si estamos trabajando con la versión estable de las PEAR, lo más habitual, será necesario añadir "-beta" al nombre del paquete o cambiar la variable de configuración preferred_state. La instalación con el frontend web de las PEAR es igualmente sencilla, lo único a tener en cuenta es que necesita el paquete XML_Serializer que no se instalará automáticamente si tenemos preferred_state=stable ya que también se encuentra en fase beta.

Guardando un enlace en del.icio.us

El código necesario para guardar un enlace es el siguiente:

require_once 'Services/Delicious.php';
$username = 'usuario';
$password = 'contraseña';
$dlc = new Services_Delicious($username, $password);
$enlace = 'http://www.phpbsd.net/';
$titulo = 'PHPBSD.net';
$desc = 'Blog de programación PHP';
$tags = 'php, programación, webdev';
$result = $dlc->addPost($enlace, $titulo, $desc, $tags);
if (PEAR::isError($result)) {
  die($result->getMessage());
} else {
  echo 'OK';
}

Con los nombres de las variables se entiende perfectamente como funciona el tema.

Generando una nube de tags

A continuación una utilización un poco más divertida, generar una nube con todas las etiquetas de una cuenta determinada:

$tags = $dlc->getTags();
foreach ($tags as $key => $value) {
    echo '<a href="http://del.icio.us/'.$username.'/'.$key.'" title="'.$key.' ('.$value.')" style="font-size:'.(70+14*$value).'%">'.$key.'</a> ';
}

Lo anterior sólo es un ejemplo rápido, dependiendo de la cantidad de etiquetas y enlaces se debería hacer algo más con el font-size. Puedes ver funcionando el anterior código sobre mi cuenta en del.icio.us en este ejemplo de nube de tags.

Con Services_Delicious se ha de tener en cuenta que aunque podemos enviar datos con la clásica codificación iso-8859-1 las respuestas vienen en UTF-8, hemos de trabajar con UTF-8 o usar las funciones utf8_encode() y utf8_decode() según convenga, otra opción es modificar Services_Delicious y cambiar la forma de trabajar con XML_Serializer.

Aplicaciones

Aunque la API es muy sencilla nos permite añadir tags a prácticamente cualquier tipo de aplicación PHP, por ejemplo con el anterior código fácilmente nos curramos un pluguin para WordPress que cada vez que colgamos un post lo guarde en del.icio.us, que permita generar una nube de tags, etc. (si es que todavía no existe). Otro ejemplo es con una aplicación de comercio electrónico con stock online como un supermercado o una web de viajes, podemos hacer un script que recorra la BD de turno guardando todos los productos en del.icio.us y permitiendo trabajar con tags, que los usuarios puedan actualizarlos, generar nubes con ellos, etc.

Si a pesar de disponer de tu aplicación PHP en tus servidores o en tu servicio de hosting te gusta sacarte el trabajo de encima con servicios como FeedBurner para los RSS, Flickr para las imágenes, YouTube para los Vídeos... ¿porque no usar del.icio.us para tus tags?

Trabajar con del.icio.us para los tags de tu web tiene la ventaja de que del.icio.us en si es un buen sistema de promoción, mucha gente anda suscrita a RSS de determinados tags, se busca bastante directamente en del.icio.us, etc., y también tiene su efecto en SEO, cada nuevo tag representa un backlink hacia nosotros desde la página de dicho tag. El inconveniente de trabajar con un tercero está claro, que el usuario se pierda por del.icio.us y no vuelva a nuestra tienda o a nuestro blog, aunque siempre podemos usar del.icio.us y no enlazarlos.

A parte de añadir la dimensión de "tag" a nuestra aplicación otro ejemplo de uso de la API de del.icio.us es acceder a nuestros bookmarks de una forma totalmente personalizada y poder mostrarlos como queramos. Un ejemplo de esto es lo que hace Pau Iglesias en la sección de enlaces de su blog, aunque usando otra clase para acceder a la API de del.icio.us que también está muy bien, de hecho es un proyecto más maduro que Services_Delicious.

Esta otra clase es una modificación del mismo Pau Iglesias de la clase original de Dietrich Ayala, autor de las conocidas NuSOAP. En comparación Services_Delicious me gusta más porque básicamente me gusta trabajar con PEAR y usa XML_Serializer/HTTP_Request que, a parte de que ya me las conozco, hacen que el código sea muy limpio y fácilmente adaptable a tus necesidades, pero si no te gustan las PEAR el proyecto del.icio.us PHP API de Pau Iglesias se merece una ojeada, proporciona más o menos las mismas funcionalidades que Services_Delicious pero con el añadido de un interesante sistema de cache.

Etiquetas:
Jun 13

En muchas ocasiones disponemos de un servicio de hosting compartido que no tiene las PEAR instaladas, o que ofrece una instalación mínima que no incluye las clases que necesitamos. A continuación describo como realizar una instalación local de las PEAR en un servidor compartido usando la linea de comandos o un navegador web. A parte de instalaciones en servicios de hosting estos procedimientos resultan muy útiles en otras ocasiones, por ejemplo si queremos probar nuevas clases o distintas versiones de clases sin necesidad de instalarlas en el sistema.

Instalación por consola

Si disponemos de acceso SSH, Telnet, o directo a la consola del servidor este es el procedimiento a seguir.

[1] Iniciamos la sesión de usuario.

[2] Creamos una configuración por defecto para las PEAR:

$ pear config-create $HOME .pearrc

[3] Creamos un directorio temporal en nuestra cuenta para evitarnos problemas de permisos en el directorio "/tmp" del sistema:

$ mkdir $HOME/tmp

[4] Cambiamos las variables necesarias para que trabajen con nuestro directorio temporal:

$ pear config-set download_dir $HOME/tmp/download
$ pear config-set temp_dir $HOME/tmp

[5] Verificamos la correcta configuración:

$ pear config-show

[6] Instalamos el sistema base:

$ pear install -o PEAR

[7] Instalamos las clases PEAR que necesitemos:

$ pear install <clase>

o si queremos instalar alguna versión beta:

$ pear install <clase>-beta

Instalación vía web

Si sólo disponemos de acceso por FTP o Web (como yo con HostGator) o si no queremos trabajar con comandos estos son los pasos necesarios para realizar una instalación vía web.

[1] Vamos a http://go-pear.org/ y guardamos el script PHP que aparece como go-pear.php.

[2] Creamos un directorio en nuestro servidor, por ejemplo "pear", y copiamos go-pear.php dentro.

[3] Abrimos con un navegador la URL correspondiente, por ejemplo:
http://ejemplo.com/pear/go-pear.php

[4] Seguimos los pasos que nos aparecen por pantalla, las opciones por defecto son válidas en la mayoría de ocasiones.

[5] Posteriormente podremos gestionar las clases PEAR instaladas abriendo:
http://ejemplo.com/pear/
Allí nos encontraremos el Web-based PEAR Frontend que nos permitirá instalar, desinstalar y actualizar clases, buscar nuevas clases, cambiar la configuración, etc.

[6] Es importante proteger el directorio de las PEAR para que no sea accesible al público. Al estar dentro del DocumentRoot del servidor Apache cualquiera podrá acceder a la configuración de nuestras PEAR a no ser que protejamos el directorio con usuario+contraseña y/o filtrando por IP.

Snapshot del frontend web de las PEAR:

PEAR Frontend snapshot

Configuraciones finales

Una vez completado con éxito cualquiera de los dos procedimientos anteriores sólo nos faltará añadir el directorio que contiene las clases PEAR, en el ejemplo "pear/PEAR", al include_path del PHP para que funciones como include() y require() puedan encontrar las nuevas clases:

set_include_path(get_include_path().PATH_SEPARATOR.'/home/usuario/pear/PEAR');

Se ha de cambiar "/home/usuario" por la ruta física a tu home de usuario. En el último paso del proceso de instalación vía web se muestra la ruta física a las clases, si has realizado una instalación por consola teclea pwd en tu home y añade "pear/PEAR".

Etiquetas:
Jun 07

WordPress está disponible en varios idiomas gracias al sistema de localización GNU gettext. Dentro del código de WordPress nos encontramos dos funciones para hacer el trabajo con gettext mucho más sencillo y así poder programar plugins y temas multi-idioma, estas funciones son las mismas que usa internamente el propio WordPress. A pesar de disponer de estas facilidades es muy frecuente encontrarse temas en un único idioma, es cierto que hacer temas multi-idioma añade un coste extra a la confección de un tema, pero en mi opinión es algo que merece la pena si queremos dar mucha más visibilidad a nuestro trabajo. A continuación describo como usar estos mecanismos que proporciona el WordPress para realizar un tema multi-idioma.

[1] Escoger un nombre para el "dominio". Se trata de escoger un nombre para todo el conjunto de traducciones, normalmente el mismo nombre del tema nos servirá, lo único a tener en cuenta es que ha de ser un nombre único entre todos los temas y plugins instalados.

[2] Modificar las plantillas. Se trata de usar unas determinadas funciones PHP para sacar por pantalla cualquier cadena de texto que tengamos en nuestras plantillas.

Las funciones son _e($texto) y __($texto). Estas funciones buscan una traducción de $texto en el catálogo usando como índice el texto pasado y si no la encuentran devuelven $texto sin modificar, el idioma a traducir lo define la constante WPLANG (en wp-config.php). La única diferencia entre las dos funciones es que __() devuelve con un return() el texto traducido y _e() lo imprime por pantalla con un echo().

Un ejemplo de __e():

<h2>About</h2>

por:

<h2><?php _e('About','ejemplo_domain'); ?></h2>

Un ejemplo de __():

the_content('Read the rest of this entry');

por:

the_content(__('Read the rest of this entry','ejemplo_domain'));

Para la correcta traducción de las frases en ocasiones es necesario usar printf() o sprinf() junto con __(). Por ejemplo:

printf(__('You are currently browsing the %1$s weblog archives for the %2$s category.','ejemplo_domain'), get_settings('siteurl'), single_cat_title('',false));

Esto permite que el traductor entienda más el significado de la frase que si la troceamos con varios _e(), también permite cambiar el orden de las variables (%1$s y %2$s) si nuestro idioma lo requiere.

A parte de los textos que se mostrarán por pantalla tenemos otros strings importantes a internacionalizar, son los que definen el formato de las fechas. Por ejemplo:

the_time('l, F jS, Y');

por:

the_time(__('l, F jS, Y'),'ejemplo_domain');

[3] Crear el catálogo de traducciones. Existen varios programas para trabajar con archivos POT, a continuación describo brevemente como usar poEdit para generar el archivo POT y MO a partir de las plantillas anteriormente modificadas.

  • Instalamos poEdit.
  • Configuraciones iniciales como nuestro nombre, etc. en "File -> Preferences".
  • Creamos un nuevo catálogo con "File -> New Catalog". En el cuadro de diálogo que aparece:
    • En "Project Info" introducimos el nombre del proyecto, idioma, etc. y la codificación utf-8 (por defecto en todo WP).
    • En "Paths" añadimos un único path, el ".".
    • En "Keywords" añadimos los nombres de las funciones usadas para trabajar con gettext, "__e" y "__" (sin las comillas).
  • Lo siguiente es generar el catálogo. Es necesario guardarlo en el mismo directorio que los archivos del tema y ponerle el nombre del locale deseado (p.e. es_ES).

Si todo ha ido bien poEdit escaneará todas nuestras plantillas y generará un archivo POT listo para empezar a traducir. Cada vez que se guarda el catálogo se generará automáticamente el MO, que es el que realmente usa el código PHP, a no ser que configuremos lo contrario en "Preferences".

[4] Cargar las traducciones desde el tema. Ahora sólo falta que nuestro tema cargue el catálogo apropiado dependiendo del idioma definido, esto lo conseguimos añadiendo lo siguiente antes de cualquier llamada a __() o _e(), un buen lugar es al principio del index.php o del header.php:

load_theme_textdomain('ejemplo_domain');

[5] Listos! En el siguiente acceso a nuestro blog veremos todas las frases traducidas.

Aunque el procedimiento descrito está centrado en WP y las funciones que nos brinda para la internacionalización es muy parecido al uso de otros sistemas basados en gettext, como plugins Smarty, o al uso directo de las funciones gettext del PHP.

Si quieres más información puedes consultar los capítulos Traduciendo WordPress y Escribiendo un Plugin de la documentación de WordPress.

Etiquetas:
preload preload preload