Temas de WordPress a la medida

Siguiendo mi trabajo de investicación entorno a wordpress he encontrado anoche una web muy curiosa, wordpress theme generator y no deja de asombrarme más la fuerza que ha cogido esta herramienta de blog.

Wordpress Theme Generator

WordPress theme generator permite editar de manera gráfica las caracteristicas de nuestro tema, soporta wordpres 2.1, widgets, soporta todos los browsers y yahoo GUI :

  • Color del texto del encabezado
  • Imagen de background
  • Layout básico de dos o tres columnas
  • Menú básico
  • Color de texto del post (titulo, contenido)
  • Ancho del body
  • Y otras caracteristicas básicas

Con esta herramienta un usuario novato sin conocimientos en html, javascript, php y css puede diseñar un tema propio sin mucho esfuerzo.

Disfrutenlo… :-).

WpZipper, Instalador de WordPress a la carta

WPZipper

En ifacethoughts encontré una referencia a WpZipper, un portal que permite descargar una versión de wordpress. Los pasos son muy sencillos y sigue el clasico 3 pasos de web2.0. Los pasos son:

  1. Seleccione los plugins: Tiene un sistema de busqueda por palabra y ofrece una lista inicial aleatoria.
  2. Seleccione los temas: Igual que el anterior permite seleccionar un conjunto de temas para la instalación.
  3. Descargar en un fichero zip: Permite descargar una versión de wordpress con todo lo necesario de acuerdo a los datos seleccionados.

El portal es muy sencillo de utilizar y para utilizarlo solo basta con registrarse, no tiene confirmación de correo. Otra característica es que permite guardar las “Instalaciones Virtuales” como le llaman a la configuración seleccionada. Además permite descargar la version 2.2 de wordpress.

Según su web, tienen más de 3000 temas y ya llevan más de 100.000 descargas, la verdad es que da una flexibilidad muy grande para buscar una configuración, pero en mi concepto se debe haber cacharreado un poco con wordpress y conocer en cierta forma los plugins para realizar una buena selección.

Una cosa que echo en falta es un sistema de etiquetado de plugins y temas para hacer las búsquedas más amenas y un sistema de ranking, no estaría mal esta característica pues ayudaría a hacer mejores selecciones.

WordPress y Bucle

WordPress utiliza el bucle de post para permitir manipular los mismos. De acuerdo al funcionamiento de wordpress, el número de post que presenta depende donde se ejecute. Ej. Si se llama index.php se muestran los más recientes, pero si se está en una categoría, se muestran los más recientes en esa categoría.

Como necesitaba mostrar los más recientes, implementé una funcion que recupera los registros y usa start_wp para hacer el tratamiento de los mismos.

function plugin_showlast($n){
$postslist = get_posts(‘numberposts=’.$n.’&order=ASC&orderby=post_title’);
foreach ($postslist as $post) :start_wp(); ?>
<li><a href='<?php the_permalink();?>’><?php the_title(); ?></a></li>
<?php endforeach;
global $wp_query;
// Since the old style loop is being used, advance the query iterator here.
$wp_query->rewind_posts();
}

Esta función, tiene la particularidad de que saca los $n últimos dependiendo del sitio donde se ejecute, con lo cual la función  get_posts es contextual.

La instrucción:

$wp_query->rewind_posts();

Se usa para reiniciar la variable que contiene los post del contexto, me vi oblicado a ponerla porque se presenta un problema al intentar ver un registro único para hacer comentarios, el bucle principal de single.php donde saca un mensaje que indica que no se han encontrado registros con el criterio utilizado.  (Cuando uso esta función antes de la ejecución del bucle por defecto de wordpress).

sobreescribir librerias de javascript en wordpress

Tengo instalado wordpress 2.2.3 que viene con prototype 1.5.0, en el desarrollo de mis plugins estoy utilizando prototype 1.5.1, como no quiero cargar dos veces la librería de prototype, me he dado a la tarea de buscar la forma de reemplazarla.

El problema que tengo radica que no hay una llamada del API de WordPress que permita quitar las entradas en los scripts registrados, por ello, revisando un poco el código me he dado a la tarea realizar mi própia función para hacerlo.

En busca de una solución, he pasado por dos versiones distintas, la segunda, a mi parecer la más sencilla y limpia consiste en implementar una función de desregistro de script y utilizar el objeto del tipo WS_Script que trae definido wordpress.

function plugin_unregister_script( $handle) {
global $wp_scripts;
if ( !is_a($wp_scripts, ‘WP_Scripts’) )
$wp_scripts = new WP_Scripts();
$wp_scripts->remove($handle);
}

Esta función puede ser usada en la función de registro de cabeceras del plugin para “limpiar” los scripts que deseamos actualizar. Ej.

function plugin_header() {
$webutil=new WSPTWebUtil();
$url=$webutil->getServerURL();
$jsPrototype=$url.’/js/prototype.js’;
$jsWeb=WSPT_PLUGGIN_URL.’/lib/wspt.js’;
//desregistramos el script deseado
plugin_unregister_script(‘prototype’);
//registramos de nuevo el script
wp_register_script(‘prototype’,$jsPrototype,false,’1.5.1′);
wp_register_script(‘wspt’,$jsWeb,’0.1′);
//Mandamos a imprimir los scripts registrados.
wp_print_scripts(array(‘wspt’,’prototype’));
}

Cosas que no he probado, si un plugin invoca la función wp_print_script antes de la ejecución del plugin en cuestión.

Una segunda alternativa, en realidad la primera, fue en implementar una clase WS_ScriptsWrapper que extiende a WP_Scripts y sobreescribe el métodos add para que actualice la entrada del script.
El la clase WP_Scripts gestiona el registro de los scripts, en el método add que es el que nos interesa, no deja registrar un elemento si ya existe en el array de “handlers”.

function add( $handle, $src, $deps = array(), $ver = false ) {
if ( isset($this->scripts[$handle]) )
return false;
$this->scripts[$handle] = new _WP_Script( $handle, $src, $deps, $ver );
return true;
}

Problema, se guarda una variable global $wp_scripts, y PHP no permite hacer un cast para convertir un objeto de mi clase WP_ScriptsWrapper en WP_Scripts. Aunque al final lo he hecho serializando y des-serializando el objeto con un reemplazo de por medio.

La solución, escribir una función my_wp_register_script, que llame el método add modificado de la clase MyWP_Scripts que extiende de WP_Scripts y sobreescribe el método add.

$strobj=serialize($tmpwp_scripts);
$strobj=str_replace(‘WP_ScriptsWrapper’,’WP_Scripts’,$strobj);

Sencillo, pero funciona si quieres convertir recuperar la referencia del objeto padre. (Sobra aclarar que pierdes la referencia al objeto hijo y no podras alcanzar sus métodos.). Con este artilujio, se pueden tener varias alternativas de implementación, pero son más problemáticas que la segunda es decir.. la primera que explique..

Mi primera Cana

Este dia (Miércoles 30 de Mayo) quedara marcado en mi como "El dia en que descubrí Mi primera Cana". Llevaba mucho tiempo esperando este dia. Esta mañana al pasar por el aseo de mi trabajo, me mire al espejo y mis ojos no daban crédito, ahí estaba, blanca y solitaria en medio de una maraña de cabello negro. Aunque me resisti por un momento a creerlo, efectivamente una segunda, tercera y cuarta mirara me lo confirmaron. No era un sueño, estaba ahí sin duda alguna.

Este dia esperado lo hace mucho más especial el hecho de la existencia de la canción "Mi primera Cana" de Diomedes Dias, canción que me hace evocar viejos tiempos en mi pueblo natal, La Plata Huila.

En aquellos tiempos, al escuchar:

Una hebra de cabello adorna mi cuerpo
una hebra de cabello adorna mi alma
ay! ve mi primera cana noticias de mi vejez

Se me venia a la cabeza la imagen de mi madre a quien quiero con toda mi alma y a la que recuerdo siempre que escucho esta canción. Igualmente, me acuerdo de mis amigos, Flor Divia Collazos y Mauricio Rentería, grandes amistades de mi juventud a quienes recuerdo, admiro y quiero con especial aprecio.

La siguiente estrofa me traslada a mi entorno familiar.

Yo sé que Rafael Santo Cuando me vea
lleno de juventud le dice a la mama
ay ve papá tiene canas, no se si ella se lo crea
.

Cuando no tenia hijos, siempre pensaba en decirle a mi hijo (me imaginaba que seria uno y hombre) que siempre que escuchara esta canción se acordara de mi, y cuando estuviera viejo y muriera, lo siguiera haciendo pues esta estrofa me hizo pensar en él aun antes de conocer a su madre y a él mismo. Mauricio, recuerdame con esta canción.

Con las siguientes tres estrofas.

Un montón de mujeres se me llevaron
lo mejor de mi vida sentimental
hay unas que me pagaron mal
y otras que muy bien se portaron

La vida me ha golpeado mas de dos veces
pero yo he sido un hombre muy optimista
ay! ve gracias virgen del Carmen
por dame tantas cosas bonitas

Por ejemplo me diste una mujer
que ha sido como la madre mía
de Luis Ángel, de Santo Rafael
de Diomedes y el gran Martín Elías

Mi mente se dirige a mi esposa, Paula Inés Martinez, la madre de mis hijos, una mujer muy especial a la que amo profundamente. Y como dice la canción, Paula es de las mujeres que bien se portaron , se sigue portando y se seguirá portando (Espero ). Y en la tercera estrofa …me diste una mujer… está su nombre clavado, con nuestros hijos Oscar Mauricio y Mara Isabel.

Y el texto:

ay! ve gracias virgen del Carmen
por dame tantas cosas bonitas

Me hace agradecer a Dios y la Virgen por todo lo obtenido, mi mujer, mis hijos, mi familia, mis amigos, la familia de mi esposa y todo lo que nos rodea.

Inconsistencia en $_SERVER PHP

He estado programando un plugin para wordpress con un servidor apache 2.2 ejecutandose en el puerto 8080 y php5.2.1. Pero esta mañana se me presentó un problema con un código que aparentemente no tiene nada de malo.

El código es el siguiente.

var GB_ROOT_DIR = “<?php echo ‘http://’.$_SERVER[‘SERVER_NAME’].’:’.$_SERVER[‘SERVER_PORT’].$this->gbPath?>”;

El Problema

Bajo ciertas condiciones en WordPress al cargar una entrada específica (usando single.php), la variable $_SERVER[‘SERVER_PORT’] me da el valor de 80, en lugar de 8080 que es donde escucha el servidor web.

La Solución

Luego voltear un rato, encontré lo siguiente:

Aunque mi servidor está en el puerto 8080 (La directiva Apache tiene este valor -Listen 8080-), la variable ServerName está en el puerto 80. (ServerName server.server.com:80).

Cambiando el valor de server.server.com a 8080 se solucionó el problema

El lio es que esto solo se presentó al mostrar las entradas del blog individuales, las entradas de categorías y el index no presentaron ningún problema.

El contenido de la variabel $_SERVER es el siguiente.

Array ( [REDIRECT_STATUS] => 200
[HTTP_ACCEPT] => image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
[HTTP_REFERER] => http://localhost:8080/blogs/ws/2007/05/25/pepito-perez-2/59
[HTTP_ACCEPT_LANGUAGE] => es
[HTTP_ACCEPT_ENCODING] => gzip, deflate
[HTTP_USER_AGENT] => Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1)
[HTTP_HOST] => localhost:8080
[HTTP_CONNECTION] => Keep-Alive
[HTTP_COOKIE] => rated_23=1; dbx-postmeta=grabit:0+|1+|2+|3+|4+|5+|6+&advancedstuff:0-|1-|2-; dbx-pagemeta=grabit:0-|1-|2-|3-|4-|5-|6-|7-&advancedstuff:0- [PATH] => C:\\WINDOWS\\SYSTEM32;C:\\WINDOWS;C:\\WINDOWS\\SYSTEM32\\WBEM;C:\\Archivos de programa\\Microsoft SQL Server\\80\\Tools\\BINN;C:\\Archivos de programa\\Panda Software\\Panda Antivirus Platinum\\;c:\\Archivos de programa\\Microsoft SQL Server\\90\\Tools\\binn\\;C:\\Archivos de programa\\MySQL\\MySQL Server 5.0\\bin
[SystemRoot] => C:\\WINDOWS
[COMSPEC] => C:\\WINDOWS\\system32\\cmd.exe
[PATHEXT] => .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH [WINDIR] => C:\\WINDOWS
[SERVER_SIGNATURE] =>
[SERVER_SOFTWARE] => Apache/2.2.4 (Win32) PHP/5.2.1
[SERVER_NAME] => localhost [SERVER_ADDR] => 127.0.0.1
[SERVER_PORT] => 80
[REMOTE_ADDR] => 127.0.0.1
[DOCUMENT_ROOT] => D:/apacheweb/htdocs
[SERVER_ADMIN] => diego.acosta@xxxxxx.org
[SCRIPT_FILENAME] => D:/apacheweb/htdocs/blogs/ws/index.php [REMOTE_PORT] => 2809
[REDIRECT_URL] => /blogs/ws/2007/05/25/pepito-perez-2/59 [GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1 [REQUEST_METHOD] => GET
[QUERY_STRING] =>
[REQUEST_URI] => /blogs/ws/2007/05/25/pepito-perez-2/59
[SCRIPT_NAME] => /blogs/ws/index.php
[PHP_SELF] => /blogs/ws/index.php
[REQUEST_TIME] => 1180439795 )

Puede observase que [HTTP_HOST] => localhost:8080 y [SERVER_PORT] => 80 tienen valores diferentes.

Un sudoku como aplicación 2.0

Sudoku 2.0

En WidgetBox he encontrado un enlace a un aplicación de Sudoku (SudokuPark) que usa tecnologías de web2.0. La aplicación tiene una interfaz muy agradable y limpia, permite seleccionar juegos con diferentes niveles de dificultad, descargar sudokus en pdf (ebook), revisar el acierto de la solución que el jugador está haciendo mientras juega, imprimir y ver la solución.

Hecho de menos la posibilidad de guardar el estado del juego por si no me da tiempo de resolverlo. Aunque un punto muy bueno es que puede funcionar como un widget dentro de otras aplicaciones como WordPress, iGoogle, blogger, typepad, o simplemente descargarlo como un script de javascript.

<script type=”text/javascript” src=”http://widgetserver.com/syndication/subscriber/InsertPanel.js?panelId=09d55df1-80af-402c-812a-46653863ec65″></script><noscript>Get great free widgets at <a href=”http://www.widgetbox.com”>Widgetbox</a>!</noscript>

Dia de Colombia

El sabado pasado (29 de mayo de 2007) celebraron el el Colegio Mayor Miguel Antonio Caro el dia de Colombia, se realizó una presentación de música de la costa norte de Colombia, algo de comilona; empanadas, arepas, chicharrón, chorizo, almojabanas, bocadillo y galletas entre otras.

img_0003-wince.jpg


img_0059-wince.jpg

Hubo cervecita, aguardiente antioqueño y ron viejo de caldas y estuvimosbailando un ratito, la pasamos muy bien.Juanita, la niña de Juan Carlos se robó el show, la llevaron disfrazada de bailadora de currulao, estaba preciosa. Luego, le pusieron un disfraz de bambuco para completar la fiesta. Su padre muy contento, se la puso de sombrero para mostrarla mejor :-).Al final del dia, nos reuniomos alrededor de la piscina de bombas y nos tomamos una foto de grupo. Aqui están algunas de las mujeres. Las más lindas, Juanita y Mara. 🙂

diacolombia_mujeres.jpg

De izquierda a derecha Mónica, Sandra, Anita y Juanita, Paula y Mara.

 

Esperamos poder estar el año que viene en una nueva celebración con todos los que estamos por aqui. Gracias Sandrita por las invitaciones

Primeros pasos con Typo3

Typo3

He comenzado a estudiar Typo3, un gestor de contenido ampliamente conocido en Internet el cual cuanta con miles de sitios que lo usan. Según sus características, es bastante potente y según comentarios leidos en diferentes foros es de más alto nivel que Joomla por ejemplo.

Mi primera impresión no ha sido del todo buena, la instalación aunque se realiza con éxito, no me permitió ingresar a la interfaz de administración, todo debido a un pequeño conflicto que tiene con mysql 5.0 y el manejo de las definiciones de las tablas con campos de tipo TEXT y BLOB(Ver Bug), los cules están marcados como NOT NULL sin valor por defecto, y Mysql 5.0 no admite valores por defecto para campos tipo TEXT y BLOB.

Según se puede ver en los bugs de typo3 este problema se viene presentando desde la vesion 3.08 aproximadamente y aúno no está resuelto en la versión actual (4.1.1) cosa que me ha dejado un poco triste, pues para solucionarlo me he visto a forzar la ejecución de mysql 5.0 deshabilitando la opción strict mode.

Cosa que no pasa con Joomla, el cual se instaló y se ejecutó sin ningún problema desde el inicio. Por otro lado, el uso del lenguage TypoScript para definir la estructura y comportamiento del portal también hace difícil la configuración rápida de un portal que con Joomla puedes tenerlo en un pocos de minutos.

Reunión GIT en Madrid

El pasado viernes 4 de Mayo nos reunimos en Madrid varios miembros del GIT (Grupo de Ingeniería Telemática) de la facultad de Ingeniería Electrónica y Telecomunicaciones de la Universidad del Cauca en Colombia.

Como siempre, fue una reunión muy agradable. Personalmente estas reuniones las encuentro muy positivas por varias razones, primero por reencontrarse con antiguos compañeros de trabajo, segundo por contar con la compañía de personas que formaron parte de nuestra vida en algún momento y con las que se sigue manteniendo un hilo de contacto y tercero porque es una forma de fomentar la unión de un grupo de investigación con miembros que actualmente están fuera estudiando o que aunque ya no estemos vinculados a la facultad seguimos perteneciendo a él aunque sea de corazón.

Café IRIS. Madrid

En esta ocasión se contó con la presencia de Alvaro Rendón, Mario Solarte, Gustavo Ramirez y Esposa, y yo Diego Acosta. Aparte de ponernos al dia en algunos temas, nuestra conversación giró entorno a la cohesión del grupo y el camino que le queda por delante una vez terminados los proyectos europeos que estaban desarrollando.

El GIT ha sido nicho de formación de investigadores y propulsor de ideas y habilidades. Yo personalmente me sigo sintiendo miembro aunque no lo sea por la via administrativa al no pertenecer a la Universida del Cauca, lo soy por pertenencia la grupo. Después de 5 años de haber dejado el grupo y haber sembrado una semilla en wapcolombia, me siento orgulloso de haber pasado por el DIT y el GIT y agradezco la formación allí recibida.

Como producto de esta reunión, y dada mis recientes actividades en tecnologías web2.0 propongo la creación de un blog que permite promover la comunicación entre los miembros o ex-miembros del GIT. Para ello he creado una entrada en wordpress, un sitio que permite alojar el servicio de manera gratuita y desde el cual podemos iniciar este proyecto.

La URL es: http://gitblog.wordpress.com, hubiera deseado tener blogit.wordpress.com, pero ya estaba reservado. Espero que me ayuden a promover esta idea, inicialmente estaré yo de administrador, solicito que los que quieran colaborar se registren al site y vamos armando nuestro proyecto de colaboración basado en blog.