¿Dónde colocar una biblioteca PHP de terceros?
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?
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.

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.

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.

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

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.

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');

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

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

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.
