Unde să plasez o bibliotecă PHP de la terți?
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ă?
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.

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.

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.

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

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

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

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

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

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.
