Dove inserire una libreria PHP di terze parti in WordPress?

21 ott 2011, 16:12:56
Visualizzazioni: 17K
Voti: 9

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?

2
Commenti

Questo sviluppo è per uso privato su un singolo sito o per più siti / rilascio pubblico?

Rarst Rarst
21 ott 2011 16:21:46

È per una suite di plugin open source. Sto aggiornando la domanda per precisarlo.

gou1 gou1
21 ott 2011 16:31:59
Tutte le risposte alla domanda 4
4

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.

21 ott 2011 16:47:22
Commenti

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.

gou1 gou1
21 ott 2011 17:13:06

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.

chrisguitarguy chrisguitarguy
21 ott 2011 17:24:45

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

gou1 gou1
21 ott 2011 17:38:50

Oh, li metterei in una cartella library all'interno di ogni plugin/tema. Poi nel file principale del plugin, esegui il controllo e includili se necessario.

chrisguitarguy chrisguitarguy
21 ott 2011 17:56:44
0

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.

12 gen 2013 19:25:10
2

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');
13 gen 2013 02:34:01
Commenti

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

gou1 gou1
15 feb 2013 17:57:32

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

webaware webaware
16 feb 2013 00:51:37
1

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.

21 ott 2011 16:47:53
Commenti

Anche io all'inizio pensavo la stessa cosa, ma ho scoperto che non è sufficiente includere le tue librerie in un solo plugin attivo: a volte (ad esempio durante l'attivazione) il file del plugin "core" non verrà richiesto.

gou1 gou1
21 ott 2011 18:19:09