Dove inserire una libreria PHP di terze parti in WordPress?
Sto sviluppando una serie di plugin open-source e un tema (tutti parte di una "suite") che utilizzano la stessa libreria PHP di terze parti. Mi chiedo qual è il modo migliore per includerla in WordPress. Ecco alcune opzioni:
- inserirla in uno dei plugin e richiedere che quel plugin sia installato e attivato
- creare un plugin "core" speciale che non fa altro che includere la libreria
- posizionarla direttamente nella cartella
wp-content
Qualche opinione in merito?
Se ogni plugin/tema funziona in modo indipendente, allora probabilmente dovresti includere la libreria in ogni tema/plugin.
Poi basta verificare se una classe o funzione della libreria di terze parti esiste prima di richiederla.
<?php
if( class_exists( 'SomeClass' ) )
{
// require/include qui
}
oppure
<?php
if( function_exists( 'some_function' ) )
{
// Require/include qui
}
In alternativa, potresti racchiudere ogni funzione/classe/variabile/costante della libreria di terze parti in un controllo per verificare se esiste, come le funzioni pluggable.
Se tutti i plugin e il tema sono dipendenti l'uno dall'altro, allora non ha molto senso dividerli e dovresti probabilmente ripensare questa scelta.

I plugin hanno funzionalità diverse, da qui la separazione: attivi solo ciò che desideri.
Ma tutto si basa su un framework, ecco perché devo includere quella libreria. Ha un autoloader e un bel po' di classi, quindi controllare/richiedere ogni classe sarebbe davvero una seccatura. E non posso semplicemente includerlo in ogni classe perché registrerebbe l'autoloader più volte.
Al momento la soluzione migliore sembra essere il plugin "core". Lo attivi per primo così carica tutte le dipendenze di terze parti, e poi selezioni i plugin che vuoi.

La stai pensando nel modo sbagliato: crea semplicemente un file bootstrap, includendo qualcosa che puoi verificare, che includa/richieda tutte le classi. Poi richiedi quel file. Un solo controllo. Non contare che i tuoi utenti capiscano di dover installare un secondo plugin.

Questa è esattamente la mia domanda: qualunque sia il metodo (plugin, bootstrapper, ecc.) dove mettere i file?

Collega tutto il codice dipendente a un'azione nel plugin della libreria.
Codice di esempio per il plugin della libreria:
add_action( 'plugins_loaded', 'load_library', 0 );
function load_library()
{
# carica tutte le classi e i file necessari
# Imposta $plugin_url e $plugin_directory
do_action( 'library_loaded', $plugin_url, $plugin_directory );
}
Nel tuo codice dipendente non fare nulla prima che l'azione venga chiamata:
add_action( 'library_loaded', 'start_my_code', 10, 2 );
function start_my_code( $lib_url, $lib_directory )
{
# esegui le operazioni
}
La libreria gestisce tutte le parti di base: verifica della versione PHP corretta, costanti di WordPress, configurazioni multi-site, ecc.
L'altro codice non farà nulla se l'azione 'library_loaded'
non viene chiamata.

Aggiungendo alla risposta di chrisguitarguy, se le tue librerie sono sotto forma di classi PHP, allora puoi utilizzare spl_autoload_register() per caricare quelle classi se non sono già state caricate da un altro plugin. Puoi quindi includere le librerie nel tuo plugin e semplicemente usarle, affidandoti al caricatore di classi per includerle quando appropriato. Puoi anche usare il caricatore di classi per caricare le classi del tuo stesso plugin.
esempio:
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');

Il problema qui non è l'autoloading ma "tutti utilizzano la stessa libreria PHP di terze parti".

Come suggerito da chrisguitarguy, ognuno potrebbe avere la propria copia della libreria, operando quindi in modo essenzialmente indipendente. Quando ciascuno viene chiamato a operare e quindi richiede la libreria, la carica se non è già stata caricata. L'autoloading delle classi fornisce semplicemente un modo conveniente per gestire la parte "caricala se non è già stata caricata".

Poiché non esiste una directory ufficiale dei vendor, opterei per il plugin "core" che non fa altro che includere la libreria. Poi fai in modo che i tuoi plugin richiedano quel plugin core.
Inserire la libreria in uno dei tuoi plugin reali richiederebbe all'utente di avere quel plugin abilitato anche se potrebbe non volerne mai utilizzare le funzionalità. Un plugin core separato sembra una soluzione più pulita.
Inserirlo direttamente in wp-content sembra la soluzione peggiore.
