Unde să plasez o bibliotecă PHP de la terți?

21 oct. 2011, 16:12:56
Vizualizări: 17K
Voturi: 9

Dezvolt câteva plugin-uri open-source și o temă (toate parte dintr-un "set") care folosesc aceeași bibliotecă PHP de la terți. Mă întreb care este cea mai bună metodă de a o include în WordPress. Iată câteva idei:

  • să o plasez într-unul dintre plugin-uri și să cer ca acel plugin să fie instalat și activat
  • să creez un plugin special "de bază" care nu face altceva decât să includă biblioteca
  • să o plasez direct în wp-content

Aveți sugestii în legătură cu această problemă?

2
Comentarii

Este acest dezvoltare pentru uz privat pe un singur site sau pe mai multe site-uri / lansare publică?

Rarst Rarst
21 oct. 2011 16:21:46

Este pentru un set de plugin-uri open source. Actualizez întrebarea pentru a sublinia acest lucru.

gou1 gou1
21 oct. 2011 16:31:59
Toate răspunsurile la întrebare 4
4

Dacă fiecare plugin/theme funcționează independent, atunci probabil ar trebui să includeți biblioteca în fiecare theme/plugin.

Apoi verificați dacă o clasă sau o funcție din biblioteca terță există înainte de a o încărca.

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

sau

<?php
if( function_exists( 'some_function' ) )
{
   // Încarcă conținutul aici
}

Alternativ, puteți înfășura fiecare funcție/clasă/variabilă/constantă din biblioteca terță într-o verificare a existenței, similar cu funcțiile pluggable.

Dacă toate pluginurile și tema sunt dependente una de alta, atunci nu prea are sens să le separați și ar trebui să reconsiderați această abordare.

21 oct. 2011 16:47:22
Comentarii

Pluginurile au funcționalități diferite, de aceea sunt separate: activezi doar ce dorești.

Dar toate se bazează pe un framework, de aceea trebuie să includ acea librărie. Are un autoloader și destul de multe clase, așa că verificarea/cererea pentru fiecare clasă ar fi cu adevărat dificilă. Și nu pot să o adaug în fiecare clasă pentru că ar înregistra autoloaderul de mai multe ori.

Momentan, soluția mai bună pare a fi pluginul "core". Îl activezi primul, astfel încât să includă toate elementele terțe, apoi selectezi pluginurile pe care le dorești.

gou1 gou1
21 oct. 2011 17:13:06

Gândești greșit: creează un fișier bootstrap, incluzând ceva pe care îl poți verifica, care include/require toate clasele. Apoi include acel fișier. O singură verificare. Nu conta pe utilizatorii tăi să își dea seama că trebuie să instaleze un al doilea plugin.

chrisguitarguy chrisguitarguy
21 oct. 2011 17:24:45

Aceasta este exact întrebarea mea: indiferent de metodă (plugin, bootstrapper etc.), unde să plasez fișierele?

gou1 gou1
21 oct. 2011 17:38:50

Oh, le-aș pune într-un folder library în fiecare plugin/temă. Apoi, în fișierul principal al plugin-ului, rulează verificarea și include-le dacă este necesar.

chrisguitarguy chrisguitarguy
21 oct. 2011 17:56:44
0

Leagă tot codul dependent de o acțiune în plugin-ul de bibliotecă.

Cod exemplu pentru plugin-ul de bibliotecă:

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

function load_library()
{
    # încarcă toate clasele și fișierele necesare
    # Configurează $plugin_url și $plugin_directory

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

În codul tău dependent, nu face nimic înainte ca acțiunea să fie apelată:

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

function start_my_code( $lib_url, $lib_directory )
{
    # execută operații
}

Biblioteca se ocupă de toate părțile de bază: verificarea versiunii corecte de PHP, constantele WordPress, configurațiile multi-site etc.

Codul dependent nu va face nimic dacă acțiunea 'library_loaded' nu este apelată.

12 ian. 2013 19:25:10
2

Adăugând la răspunsul lui chrisguitarguy, dacă bibliotecile tale sunt sub formă de clase PHP, atunci poți utiliza spl_autoload_register() pentru a încărca acele clase dacă nu au fost deja încărcate de un alt plugin. Apoi poți include bibliotecile în plugin-ul tău și doar să le folosești, bazându-te pe încărcătorul de clase să le includă atunci când este cazul. Poți folosi și încărcătorul de clase pentru a încărca clasele proprii ale plugin-ului tău.

exemplu:

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

/**
* încarcă clasele automat când este nevoie
* @param string $class_name numele clasei de încărcat
*/
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];
    }
}

// înregistrează funcția pentru încărcarea automată a claselor necesare
spl_autoload_register('wpse_31726_autoload');
13 ian. 2013 02:34:01
Comentarii

Problema aici nu este autoloading-ul, ci faptul că "toate folosesc aceeași bibliotecă PHP de la terți."

gou1 gou1
15 feb. 2013 17:57:32

Conform chrisguitarguy, fiecare ar putea avea propria copie a bibliotecii și astfel să funcționeze în mod esențial independent. Când fiecare este apelat să funcționeze și deci necesită biblioteca, aceasta este încărcată dacă nu a fost deja încărcată. Autoloading-ul claselor oferă doar o modalitate convenabilă de a rezolva partea de "încarcă-o dacă nu a fost deja încărcată".

webaware webaware
16 feb. 2013 00:51:37
1

Deoarece nu există un director oficial pentru furnizori, aș opta pentru un plugin "de bază" care nu face altceva decât să includă biblioteca. Apoi, poți configura pluginurile tale să necesite acest plugin de bază.

Includerea bibliotecii într-unul dintre pluginurile tale reale ar necesita ca utilizatorul să aibă acel plugin activat, chiar dacă nu dorește niciodată să folosească funcționalitatea acestuia. Un plugin de bază separat pare o soluție mai elegantă.

Includerea directă în directorul wp-content pare cea mai nepotrivită soluție.

21 oct. 2011 16:47:53
Comentarii

La fel m-am gândit și eu la început, dar am aflat că nu este suficient să incluzi bibliotecile într-un singur plugin activat: uneori (de exemplu, când îl activezi) fișierul plugin-ului "principal" nu va fi încărcat.

gou1 gou1
21 oct. 2011 18:19:09