web-dev-qa-db-fra.com

Où mettre un tiers PHP bibliothèque?

Je développe quelques plugins open-source et un thème (faisant tous partie d'une "suite") qui utilisent tous la même bibliothèque tierce PHP. Je me demande quel est le meilleur moyen de l'inclure dans Wordpress. Voici quelques réflexions:

  • le mettre dans l'un des plugins et exiger que ce plugin soit installé et activé
  • créer un plugin "core" spécial qui ne fait que l'inclure
  • le mettre directement dans wp-content

Des idées à ce sujet?

8
gou1

Si chaque plugin/thème fonctionne seul, alors vous devriez probablement laisser tomber la bibliothèque dans chaque thème/plugin.

Il suffit ensuite de vérifier si une classe ou une fonction de la bibliothèque tierce existe avant de l'exiger.

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

ou

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

Alternativement, vous pouvez envelopper chaque fonction/classe/variable/constante de la bibliothèque tierce dans une vérification pour voir si elle existe, comme fonctions enfichables .

Si tous les plugins et le thème dépendent l'un de l'autre, cela n'a pas vraiment de sens de les diviser et vous devriez probablement repenser à cela.

5
chrisguitarguy

Liez tout le code dépendu à une action dans le plugin library.

Exemple de code pour le plugin library:

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

Dans votre code dépendu, ne faites rien avant le lancement de l'action:

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

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

La bibliothèque gère toutes les parties de base: vérifiez la version PHP correcte, les constantes WordPress, les configurations multi-sites, etc.

L'autre code ne fera rien si l'action 'library_loaded' n'est pas appelée.

3
fuxia

Ajoutant à répondre par chrisguitarguy, si vos bibliothèques sont sous la forme de classes PHP, vous pouvez utiliser spl_autoload_register () pour charger ces classes si elles n’ont pas déjà été chargées par un autre plugin. Vous pouvez ensuite regrouper les bibliothèques dans votre plug-in et les utiliser, en vous fiant au chargeur de classes pour les inclure le cas échéant. Vous pouvez également utiliser le chargeur de classes pour charger les classes de votre propre plugin.

par exemple.

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

Etant donné que il n’existe pas de répertoire officiel des fournisseurs , je choisirais le plug-in "core" qui n'inclut que la bibliothèque. Vous faites alors en sorte que vos plugins nécessitent ce plugin principal.

Mettre la bibliothèque dans l'un de vos plugins réels nécessiterait que l'utilisateur active ce plugin, même s'ils ne veulent jamais utiliser ses fonctionnalités. Un plugin de base séparé semble plus propre.

Le placer directement dans wp-content ressemble à la pire des solutions.

0
Geert