Archive for the ‘wordpress’ Category

WordPress 2.3.3

Ha sido liberada la versión 2.3.3 de WordPress. corrige un bug detectado en la implementación de XML-RPC que permite que un usuario pueda editar post que no sean suyos mediante peticiones cuidadosamente elaboradas. Esta versión corrige otros bugs, pero si solo desea corregir lo relacionado con XML-RPC puede descargar una copia del fichero xmlrpc.php y reemplazar la existente.

Anuncios

Desde la versión 1.x de wordpress he seguido los cambios (Seguido desde el punto de vista de actualizar los blogs) y hasta ahora no he tenido mayores inconvenientes. La versión 2.2.x estuvieron muy bien y los procedimientos de actualización no me causaron mayores invenientes.

Pero la versión 2.3 introduce demasiados cambios en la estructura de la Base de Datos y cambia la localización de algunas funciones a otros ficheros que me ha fastidiado la migración de la aplicación que estaba desarrollando utilizando WP como framework base, asi que mejor me quedé quietito a sacar una versión estable de mi aplicación con la versión 2.2.3.

Para las personas que solo lleven un blog me imagino que no les debe haber causado ningún tipo de inconveniente, sobretodo si no tienen demasiados plugins instalados, pero algunos como  wp-postratings, wp-users online, y otros que usen las tablas de categorías deben ser actualizados. Dado este caso, mejor actualizo luego.

Este post resume mi lectura acerca de widgets de wordpress de automattic.com creadores de los mismos. Un widget de wordpress es un trozo pluggleable (que se puede conectar) para un sidebar. A partir de la versión 2.2, el plugin de widget forma parte del core de wordpress.

Tener habilitado wordpress para soportar widgets no es suficiente, se necesia que los temas estén habilitados para utilizarlo, en el artículo “widgetizing themes” hay un tutorial que indica como hacerlo.

Los widget de wordpress como se dijo anteriormente, se usan en los sidebar, lo primero que debemos hacer es identificar como está implementado nuestro sidebar y como está dividida cada sección. En la mayoría de los casos en los temas que nos encontramos en internet, estos widget están implemementados en listas no ordenadas html, esta estructura puede ser fácilmente adaptada via hojas de estilo en cascada (css) para lograr direntes tipos de efectos.

Para hacer un tema conciente de los widget, basta con agregar en la parte de código que genera el sidebar lo siguiente.

<?php if ( !function_exists('dynamic_sidebar')|| !dynamic_sidebar() ) : ?>
 <!-- codigo sidebar estático-->
<?php endif; ?>

La instrucción dynamic_sidebar() esta disponible en wordpress habilitados con widget y permite que el plugin de widgets fije dinámicamente el contenido del sidebar.

El siguiente paso es registrar el sidebar (Wodpress version 2.0 o superior) para ello, edite el ficher function.php (o creelo si no está) y agrege:

<?php
if ( function_exists('register_sidebar') )
    register_sidebar();
?>

Esto permitirá al plugin conocer que su tema necesita exactamente un sidebar y agregará en la parte administrativa presentación de wordpress un botón widget que le permitirá configurar dinámicamente su barra lateral de manera gráfica usando drag & drop.

El plugin de widget soporta además otras formas de sidebar y permite configurar el contenedor del título y del widget, para personalizar las salidas de los widget, usamos una versión extendida de register_sidebar.

<?php

if ( function_exists('register_sidebar') )
    register_sidebar(array(
        'before_widget' => '',
        'after_widget' => '',
        'before_title' => '<div class="title">',
        'after_title' => '</div>',
    ));
?>

La estructura de before_widget es un poco más compleja, el valor por defecto es incluye las directivas %1$s y %2$s que corresponden al id y a la clase respectivamente (El ID debe ser único en todo el documento html). De esta forma, el registro del sidebar sería:

if ( function_exists('register_sidebar') )

    register_sidebar(array(

    'before_widget' => '<div id="%1$s" class="widget %2$s">',

    'after_widget' => '</div>',

    'before_title' => '<div class="title">',

    'after_title' => '</div>',

    ));

?>

Para registrar varios sidebars use register_sidebars(n) y en el sidebar indique el sidebarque desea usar en la instrucción dynamic_sidebar(Número Sidebar).

Finalmente, para implementar nuestros propios widgets, creamos una función en el tema y la registramos como widget.

function widget_mytheme_search() {
?>
    << PASTE YOUR SEARCH FORM HERE >>
<?php
}
if ( function_exists('register_sidebar_widget') )
register_sidebar_widget(__('Search'), 'widget_mytheme_search');

Para más información sobre como hacer widgets puede leer el documento How I do Develop a Widget. Yo luego estaré escribiendo algo del tema, ahora me voy a jugar un rato con mi temas para widgetizarlos… que termino más raro. :-).

Hace apenas 8 dias wordpress sacó su nueva version, la 2.2.1 yo seguia aún con la 2.1.3 y me ha cogido por sorpresa, pero hoy me dispongo a instalarla. Ojalá no tome más del tiempo necesario. Esta nueva versión no solo corrige un montón de bugs, sinó que mejora su seguridad

Inicio bajando el .zip con el código fuente, lo descomprimo, saco un backup de la base de datos, y saco un backup de las fuentes de mi portal anterior para ahorrar tiempo. Incluyendo plugins, imágenes y todo wordpress. Como dato curioso, a los desarrolladores de wordpress les gusta el jazz y a sus versiones principales les ponen un nombre de un músico de jazz, el nombre de la versión 2.2 es Stan Getz

Según los pasos de wordpress, es importante eliminar los ficheros antiguos de wordpress cuando se actualiza desde las versiones 2.0.*, 2.1.* o 2.2, el procedimiento está en este enlace. Básicamente guardar ficheros de configuración (wp-config.php, .htaccess, .htpasswd), el contenido, los plugins, no borrar readme.html, wp.php, xmlrpc.php, and license.txt. Igualmente guardar cualquier fichero de wordpress que se haya modificado.

Desactivo los plugins que tenia activos, y por último, ejecuto es script de actualización que está en wp-admin/upgrade.php. y Voala…. en 2 segundos… funcionando el portal…. 15 minutos desde que inició el proceso.
Es simple y sencillo, ahora a ver que ha cambiado para el desarrollo de los plugins :-). Y a jugar con el tema de widgets que creo que le da una potencialidad muy alta a WordPress y a cualquier gestor de contenido.

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

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 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).

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..

Hoy he instalado el pluggin wp-rating. Este pluggin permite valorar post de una menera gráfica muy agradable para el usuario final.

Ofrece además una interfaz administrativa para controlar quien puede valorar un post, el tipo de imágen, el número de niveles de valoración, etc.

Este pluggin utiliza AJAX y además trae varias funciones administrativas para sacar estadísticas.

Otro pluggin para rating, utiliza AJAX. Este pluggin agrega una opción Administrativa donde se puede configurar quienes tienen derecho a usar el rating, el número de estrellas, el texto,

Instalación

Descargue el pluggin
– Descomprimalo
– Abra el directorio wp-content/plugins de su instalación de WP
– Copie la carpeta postratings
– Active el pluggin WP-PostRatings desde la interfaz administrativa

– Agrege los más ranqueados. (Ej. sidebar.php).