Dove mettere la libreria PHP di terze parti?


8

Sto sviluppando un paio di plugin open source e un tema (tutti parte di una "suite") che usano tutti la stessa libreria PHP di terze parti. Mi chiedo quale sia il modo migliore per includerlo in Wordpress. Ecco alcuni pensieri:

  • mettilo in uno dei plugin e richiedi che quel plugin sia installato e attivato
  • creare uno speciale plugin "core" che non fa altro che includerlo
  • mettilo direttamente dentro wp-content

Qualche idea in merito?


Questo sviluppo è per uso privato su un singolo sito o su più siti / versione pubblica?
Rarst

È per una suite di plugin open source. Sto aggiornando la domanda per sottolinearlo.
gou1,

Risposte:


5

Se ogni plugin / tema funziona da solo, allora dovresti probabilmente rilasciare la libreria in ogni tema / plugin.

Quindi controlla solo se esiste una classe o una funzione della libreria di terze parti prima di richiederla.

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

o

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

In alternativa, è possibile avvolgere ogni funzione / classe / variabile / costante dalla libreria di terze parti in un controllo per vedere se esiste, come le funzioni collegabili .

Se tutti i plugin e il tema dipendono l'uno dall'altro, non ha molto senso dividerli e probabilmente dovresti ripensarci.


I plugin hanno caratteristiche diverse, quindi la separazione: attivi solo ciò che desideri. Ma tutto si basa su un framework, ecco perché devo includere quella libreria. Ha un caricatore automatico e alcune classi quindi controllare / richiedere per ogni classe sarebbe davvero una seccatura. E non riesco davvero a lasciarlo cadere in ogni classe perché registrerebbe il caricatore automatico più volte. In questo momento la soluzione migliore sembra essere il plugin "core". Lo attivi prima, quindi richiede tutto il materiale di terze parti, quindi seleziona i plugin che desideri.
gou1,

Stai pensando a questo errore: crea un file bootstrap, incluso qualcosa che puoi controllare, che includa / richieda tutte le classi. Quindi richiede quel file. Un controllo. Non contare sui tuoi utenti per capire che devono installare il secondo plugin.
chrisguitarguy,

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

Oh, li metterei in una librarycartella in ogni plugin / tema. Quindi nel file del plug-in principale, esegui il controllo e includili se necessario.
chrisguitarguy,

3

Associa tutto il codice dipendente a un'azione nel plug-in della libreria.

Codice di esempio per il plug-in della libreria:

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

Nel tuo codice dipendente non fare nulla prima che l'azione fosse chiamata:

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

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

La libreria gestisce tutte le parti di base: verifica della corretta versione di PHP, costanti di WordPress, configurazioni multi-sito ecc.

L'altro codice non farà nulla se l'azione 'library_loaded'non viene chiamata.


1

Aggiungendo la risposta di chrisguitarguy, se le tue librerie sono in forma di classi PHP, puoi utilizzare spl_autoload_register () per caricare quelle classi se non sono già state caricate da un altro plugin. È quindi possibile raggruppare le librerie nel proprio plug-in e semplicemente usarle, facendo affidamento sul caricatore di classi per includerle quando appropriato. Puoi anche usare il caricatore di classi per caricare le classi del tuo plugin.

per 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 è il caricamento automatico ma "usano tutti la stessa libreria PHP di terze parti".
gou1,

1
Per chrisguitarguy, ognuno potrebbe avere la propria copia della libreria e quindi operare sostanzialmente in modo indipendente. Poiché ognuno è chiamato a funzionare e quindi richiede la libreria, la caricano se non è già stata caricata. Le classi di caricamento automatico forniscono semplicemente un modo conveniente per indirizzare il bit "caricalo se non è già stato caricato".
webaware,

0

Poiché non esiste alcuna directory ufficiale del fornitore , sceglierei il plug-in "core" che non fa altro che includere la libreria. Quindi fai in modo che i tuoi plugin richiedano quel plugin principale.

Mettere la libreria in uno dei tuoi veri plugin richiederebbe all'utente di abilitare quel plugin anche se potrebbe non voler mai usare la sua funzionalità. Un plug-in core separato sembra più pulito.

Metterlo direttamente nel contenuto di wp sembra la soluzione peggiore.


Questo è quello che stavo pensando anche all'inizio, ma ho scoperto che non è sufficiente inserire l'inclusione delle librerie in un plug-in attivato: a volte (ad es. Quando lo si attiva) il file del plug-in "core" non sarà richiesto .
gou1,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.