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

Marcar el Enlace permanente.

Deja un comentario