¿Dónde poner la biblioteca PHP de terceros?

8

Estoy desarrollando un par de complementos de código abierto y un tema (todo parte de una "suite") que utilizan la misma biblioteca PHP de terceros. Me pregunto cuál es la mejor manera de incluirlo en Wordpress. Aquí hay algunos pensamientos:

  • ponlo en uno de los complementos y requiere que ese complemento esté instalado y activado
  • crear un complemento especial "central" que no haga nada más que incluirlo
  • ponlo directamente en wp-content

¿Alguna idea al respecto?

gou1
fuente
¿Es este desarrollo para uso privado en un solo sitio o en múltiples sitios / publicación pública?
Rarst
Es para un conjunto de complementos de código abierto. Estoy actualizando la pregunta para señalar eso.
gou1

Respuestas:

5

Si cada plugin / tema funciona por sí solo, entonces probablemente debería colocar la biblioteca en cada tema / plugin.

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

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

o

<?php
if( function_exists( 'some_function' ) )
{
   // Require/include stuff here
}

Alternativamente, puede ajustar cada función / clase / variable / constante de la biblioteca de terceros en una comprobación para ver si existe, como funciones conectables .

Si todos los complementos y el tema dependen unos de otros, entonces no tiene mucho sentido dividirlos y probablemente debería repensar eso.

chrisguitarguy
fuente
Los complementos tienen diferentes características, de ahí la separación: solo activa lo que desea. Pero todo se basa en un marco, por eso necesito incluir esa biblioteca. Tiene un autocargador y bastantes clases, por lo que verificar / requerir para cada clase realmente sería una molestia. Y realmente no puedo soltarlo en cada clase porque registraría el cargador automático varias veces. En este momento, la mejor solución parece ser el complemento "núcleo". Primero lo activa, por lo que requiere todas las cosas de terceros, y luego selecciona los complementos que desee.
gou1
Estás pensando en esto mal: solo crea un archivo bootstrap, que incluya algo que puedas verificar, que incluya / requiera todas las clases. Entonces requiera ese archivo. Un cheque No cuente con sus usuarios para darse cuenta de que necesitan instalar un segundo complemento.
chrisguitarguy
Esa es precisamente mi pregunta: cualquiera que sea el método (plugin, bootstrapper, etc.), ¿dónde colocar los archivos?
gou1
Oh, los pondría en una librarycarpeta en cada plugin / tema. Luego, en su archivo de complemento principal, ejecute la verificación e inclúyalos si es necesario.
chrisguitarguy
3

Enlace todo el código dependiente a una acción en el complemento de la biblioteca.

Código de muestra para el complemento de biblioteca:

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

function load_library()
{
    # load all the classes and files you need
    # Set up $plugin_url and $plugin_directory

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

En su código dependiente, no haga nada antes de que se llamara a la acción:

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

function start_my_code( $lib_url, $lib_directory )
{
    # do stuff
}

La biblioteca maneja todas las partes básicas: verifique la versión adecuada de PHP, las constantes de WordPress, las configuraciones de múltiples sitios, etc.

El otro código no hará nada si 'library_loaded'no se llama a la acción .

fuxia
fuente
1

Agregando a la respuesta por chrisguitarguy, si sus bibliotecas están en forma de clases PHP, entonces puede utilizar spl_autoload_register () para cargar esas clases si no han sido cargadas por otro complemento. Luego puede agrupar las bibliotecas en su complemento y simplemente usarlas, confiando en el cargador de clases para incluirlas cuando sea apropiado. También puede usar el cargador de clases para cargar las clases de su propio complemento.

p.ej

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

/**
* autoload classes as/when needed
* @param string $class_name name of class to attempt to load
*/
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];
    }
}

// register function for autoloading required classes
spl_autoload_register('wpse_31726_autoload');
webaware
fuente
El problema aquí no es la carga automática, sino que "todos usan la misma biblioteca PHP de terceros".
gou1
1
Por chrisguitarguy, cada uno podría tener su propia copia de la biblioteca y, por lo tanto, operar de manera esencialmente independiente. Como cada uno debe operar y, por lo tanto, requiere la biblioteca, la cargan si aún no se ha cargado. Las clases de carga automática simplemente proporcionan una manera conveniente de abordar el bit "cargarlo si aún no se ha cargado".
webaware
0

Como no existe un directorio oficial de proveedores , optaría por el complemento "principal" que no hace nada más que incluir la biblioteca. Luego haces que tus complementos requieran ese complemento central.

Poner la biblioteca en uno de sus complementos reales requeriría que el usuario tenga ese complemento habilitado, aunque es posible que nunca quiera usar su funcionalidad. Un complemento de núcleo separado parece más limpio.

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

Geert
fuente
Eso era lo que estaba pensando al principio también, pero descubrí que no es suficiente simplemente incluir sus bibliotecas en un complemento activado: a veces (por ejemplo, al activarlo) el archivo del complemento "core" no será necesario .
gou1