Implementar plugins I

abril 9, 2010

Para entender como funcionan los plugins en WordPress lo mejor es desarrollar un sistema de plugins. Aunque parezca complicado, podemos programarlo en menos de 50 lineas.

Lo primero es definir como funciona nuestro sistema de plugins. Nuestro gestor de contenidos para generar una página pasa por una serie de estados o etapas predefinidos. En cada uno de esas etapas, realiza llamadas a una serie de acciones y filtros, que han sido previamente establecidos por los plugins.

Para invocar a las acciones o filtros de un estado la llamada será: run_action y run_filter, respectivamente. La diferencia entre acciones y filtros, es que estos últimos reciben un parámetro que devuelven procesado (‘filtrado’).

Vamos a añadir a cada acción la prioridad con que debe ejecutarse, esto es, el orden.

El núcleo de nuestro sistema de plugins es tan sencillo como:

function _mplugin ( $action, $hook, $function="",$priority=999){
    static $plugins, $sorted;
    
    // ordenar, si es necesario, las acciones y filtros.
    if ( ( $action=="run" || $action=="run-filter" ) &&
          isset($sorted[$hook]) && !$sorted[$hook]) {
         $sorted["hook"]= asort( $plugins[$hook] );
    }     
             
    switch ($action){
        case "add":
            $plugins[$hook][$function]= $priority;
            $sorted[$hook]=false;
            break;
        case "run";        
            if ( is_array ($plugins[$hook])){     
                foreach ( $plugins[$hook] as $f=>$p){
                   call_user_func ($f);
                }
            }
            break;
        case "run-filter"  :
            $data = $function;
            if ( is_array ($plugins[$hook])){            	 
                foreach ( $plugins[$hook] as $f=>$p){
                    $data= call_user_func ($f, $data);
                }
            }
            return $data;

    }
}

Ahorita le añadimos un pequeña interface (innecesaria, pero elegante):

unction add_action ($hook, $function, $priority=999 ){
    _mplugin ("add", $hook, $function, $priority );
}

function add_filter ($hook, $function, $priority=999 ){
    _mplugin ("add", $hook, $function, $priority );
}

function run_action ($hook){
    _mplugin ("run", $hook );
}

function run_filter ($hook, $data){
    return _mplugin ("run-filter", $hook, $data );
}

Tampoco podía faltar un pequeño test de unidad, que te paso, nos sirve para documentar el código.

function foo(){ echo "foo";}
function bar(){ echo "bar";}

function fil_b ($t) { return "$t";}
function fil_u ($t) { return "$t";}

// llamadas que aperecen en el plugins
add_action("load","foo");
add_action("load","bar") ;
add_filter("title","fil_b",1);
add_filter("title","fil_u",3);

// llamadas que aparecen en la ejecución normal.
run_action("load") ;
run_action("unload");
echo run_filter("title","texto");

En el siguiente post explicaré como funciona. Si no lo entiendes…repasa los arrays de PHP, una de las singularidades mas importantes de este lenguaje.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: