¿Dónde colocar una biblioteca PHP de terceros?

21 oct 2011, 16:12:56
Vistas: 17K
Votos: 9

Estoy desarrollando un par de plugins de código abierto y un tema (todos parte de una "suite") que utilizan la misma biblioteca PHP de terceros. Me pregunto cuál es la mejor manera de incluirla en WordPress. Estas son algunas ideas:

  • Colocarla en uno de los plugins y requerir que ese plugin esté instalado y activado
  • Crear un plugin "core" especial que no haga nada más que incluirla
  • Ponerla directamente en wp-content

¿Alguna opinión sobre este tema?

2
Comentarios

¿Este desarrollo es para uso privado en un solo sitio o para múltiples sitios/lanzamiento público?

Rarst Rarst
21 oct 2011 16:21:46

Es para un conjunto de plugins de código abierto. Estoy actualizando la pregunta para señalar eso.

gou1 gou1
21 oct 2011 16:31:59
Todas las respuestas a la pregunta 4
4

Si cada plugin/tema funciona por su cuenta, entonces probablemente deberías incluir la biblioteca en cada tema/plugin.

Luego simplemente verifica si existe una clase o función de la biblioteca de terceros antes de requerirla.

<?php
if( class_exists( 'SomeClass' ) )
{
    // require/include aquí
}

o

<?php
if( function_exists( 'some_function' ) )
{
   // Requerir/incluir aquí
}

Alternativamente, podrías envolver cada función/clase/variable/constante de la biblioteca de terceros en una verificación para ver si existe, como las funciones pluggable.

Si todos los plugins y el tema dependen unos de otros, entonces realmente no tiene mucho sentido dividirlos y probablemente deberías reconsiderar eso.

21 oct 2011 16:47:22
Comentarios

Los plugins tienen diferentes funciones, de ahí la separación: solo activas lo que necesitas.

Pero todo depende de un framework, por eso necesito incluir esa biblioteca. Tiene un autoloader y bastantes clases, así que verificar/requerir cada clase sería realmente engorroso. Y no puedo simplemente incluirlo en cada clase porque registraría el autoloader múltiples veces.

Actualmente la mejor solución parece ser el plugin "core". Lo activas primero para que cargue todas las dependencias de terceros, y luego seleccionas los plugins que deseas.

gou1 gou1
21 oct 2011 17:13:06

Lo estás enfocando mal: simplemente crea un archivo bootstrap, incluyendo algo que puedas verificar, que cargue/requiera todas las clases. Luego requieres ese archivo. Una sola verificación. No dependas de que tus usuarios descubran que necesitan instalar un segundo plugin.

chrisguitarguy chrisguitarguy
21 oct 2011 17:24:45

Esa es precisamente mi pregunta: independientemente del método (plugin, bootstrapper, etc.) ¿dónde colocar los archivos?

gou1 gou1
21 oct 2011 17:38:50

Oh, los pondría en una carpeta library dentro de cada plugin/tema. Luego, en el archivo principal del plugin, ejecutarías la verificación y los incluirías si es necesario.

chrisguitarguy chrisguitarguy
21 oct 2011 17:56:44
0

Vincula todo el código dependiente a una acción en el plugin de la biblioteca.

Código de ejemplo para el plugin de la biblioteca:

add_action( 'plugins_loaded', 'load_library', 0 );

function load_library()
{
    # carga todas las clases y archivos que necesites
    # Configura $plugin_url y $plugin_directory

    do_action( 'library_loaded', $plugin_url, $plugin_directory );
}

En tu código dependiente, no hagas nada antes de que se llame a la acción:

add_action( 'library_loaded', 'start_my_code', 10, 2 );

function start_my_code( $lib_url, $lib_directory )
{
    # haz lo que necesites
}

La biblioteca maneja todas las partes básicas: verifica la versión correcta de PHP, constantes de WordPress, configuraciones multi-site, etc.

El otro código no hará nada si la acción 'library_loaded' no es llamada.

12 ene 2013 19:25:10
2

Complementando la respuesta de chrisguitarguy, si tus bibliotecas están en forma de clases PHP, entonces puedes utilizar spl_autoload_register() para cargar esas clases si no han sido cargadas previamente por otro plugin. Luego puedes empaquetar las bibliotecas en tu plugin y simplemente usarlas, confiando en el cargador de clases para incluirlas cuando sea apropiado. También puedes usar el cargador de clases para cargar las clases de tu propio plugin.

Por ejemplo:

define('WPSE_31726_PLUGIN_ROOT', dirname(__FILE__) . '/');

/**
* Carga automática de clases cuando se necesitan
* @param string $class_name nombre de la clase a intentar cargar
*/
function wpse_31726_autoload($class_name) {
    static $classMap = array (
        'Wpse31726_Admin'       => 'class.Wpse31726_Admin.php',
        'Wpse31726_CsvLoader'   => 'class.Wpse31726_CsvLoader.php',
        'Wpse31726_Plugin'      => 'class.Wpse31726_Plugin.php',
        'parseCSV'              => 'lib/parsecsv/parsecsv.lib.php',
    );

    if (isset($classMap[$class_name])) {
        require WPSE_31726_PLUGIN_ROOT . $classMap[$class_name];
    }
}

// registrar función para la carga automática de clases requeridas
spl_autoload_register('wpse_31726_autoload');
13 ene 2013 02:34:01
Comentarios

El problema aquí no es la carga automática, sino "todos usan la misma biblioteca PHP de terceros".

gou1 gou1
15 feb 2013 17:57:32

Según chrisguitarguy, cada uno podría tener su propia copia de la biblioteca y, por lo tanto, operar esencialmente de forma independiente. A medida que cada uno es llamado para operar y, por lo tanto, requiere la biblioteca, la cargan si no se ha cargado previamente. La carga automática de clases simplemente proporciona una forma conveniente de abordar la parte de "cargarla si no se ha cargado ya".

webaware webaware
16 feb 2013 00:51:37
1

Dado que no existe un directorio de proveedores oficial, optaría por el plugin "core" que no hace nada más que incluir la biblioteca. Luego, haces que tus plugins requieran ese plugin core.

Incluir la biblioteca en uno de tus plugins reales obligaría al usuario a tener ese plugin activado, incluso si nunca quieren utilizar su funcionalidad. Un plugin core separado parece más limpio.

Incluirlo directamente en wp-content parece la peor solución.

21 oct 2011 16:47:53
Comentarios

Eso era lo que estaba pensando al principio también, pero descubrí que no es suficiente con solo incluir tus librerías en un plugin activado: a veces (por ejemplo, al activarlo) el archivo del plugin "core" no será requerido.

gou1 gou1
21 oct 2011 18:19:09