Où mettre la bibliothèque PHP tierce?


8

Je développe quelques plugins open-source et un thème (tous faisant partie d'une "suite") qui utilisent tous la même bibliothèque PHP tierce. Je me demande quelle est la meilleure façon 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 spécial "core" qui ne fait rien mais l'inclure
  • mettre directement dans wp-content

Des réflexions à ce sujet?


Ce développement est-il à usage privé sur un seul site ou sur plusieurs sites / version publique?
Rarst

C'est pour une suite de plugins open source. Je mets à jour la question pour le signaler.
gou1

Réponses:


5

Si chaque plugin / thème fonctionne seul, alors vous devriez probablement déposer la bibliothèque dans chaque thème / plugin.

Ensuite, vérifiez simplement s'il existe une classe ou une fonction de la bibliothèque tierce 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 encapsuler chaque fonction / classe / variable / constante de la bibliothèque tierce pour vérifier si elle existe, comme les fonctions enfichables .

Si tous les plugins et le thème dépendent les uns des autres, alors cela n'a pas vraiment de sens de les diviser et vous devriez probablement repenser cela.


Les plugins ont des fonctionnalités différentes, d'où la séparation: vous n'activez que ce que vous voulez. Mais tout repose sur un framework, c'est pourquoi j'ai besoin d'inclure cette bibliothèque. Il a un chargeur automatique et pas mal de classes, donc vérifier / exiger pour chaque classe serait vraiment pénible. Et je ne peux pas vraiment le déposer dans chaque classe car il enregistrerait l'autochargeur plusieurs fois. En ce moment, la meilleure solution semble être le plugin "core". Vous l'activez d'abord, il nécessite donc tous les éléments tiers, puis vous sélectionnez les plugins que vous souhaitez.
gou1

Vous pensez mal à cela: créez simplement un fichier d'amorçage, y compris quelque chose que vous pouvez vérifier, qui inclut / nécessite toutes les classes. Ensuite, demandez ce fichier. Un chèque. Ne comptez pas sur vos utilisateurs pour comprendre qu'ils doivent installer le deuxième plugin.
chrisguitarguy

C'est précisément ma question: quelle que soit la méthode (plugin, bootstrapper, etc.) où mettre les fichiers?
gou1

Oh, je les mettrais dans un librarydossier dans chaque plugin / thème. Ensuite, dans votre fichier de plugin principal, exécutez la vérification et incluez-les si nécessaire.
chrisguitarguy

3

Liez tout le code dépendant à une action dans le plugin de bibliothèque.

Exemple de code pour le plugin de bibliothèque:

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épendant, ne faites rien avant l'appel 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 bonne version de PHP, les constantes WordPress, les configurations multi-sites, etc.

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


1

Ajoutant à répondre par chrisguitarguy, si vos bibliothèques sont sous forme de classes PHP, alors 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 plugin et simplement les utiliser, en vous appuyant sur le chargeur de classe pour les inclure le cas échéant. Vous pouvez également utiliser le chargeur de classe 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');

Le problème ici n'est pas le chargement automatique mais "tous utilisent la même bibliothèque PHP tierce."
gou1

1
Par chrisguitarguy, chacun pourrait avoir sa propre copie de la bibliothèque, et ainsi fonctionner de manière essentiellement indépendante. Comme chacun est appelé à fonctionner, et nécessite donc la bibliothèque, ils la chargent si elle n'a pas déjà été chargée. Les classes de chargement automatique fournissent simplement un moyen pratique de traiter le bit "chargez-le s'il n'a pas déjà été chargé".
Webaware

0

Puisqu'il n'y a pas de répertoire officiel des fournisseurs , je choisirais le plugin "core" qui ne fait rien mais inclut la bibliothèque. Vous faites ensuite en sorte que vos plugins nécessitent ce plugin principal.

Placer la bibliothèque dans l'un de vos vrais plugins obligerait l'utilisateur à activer ce plugin même s'il pourrait ne jamais vouloir utiliser ses fonctionnalités. Un plugin core séparé semble plus propre.

Le mettre directement dans le contenu wp ressemble à la pire solution.


C'est ce que je pensais au début aussi, mais j'ai découvert qu'il ne suffit pas de mettre l'inclusion de vos bibliothèques dans un plugin activé: parfois (par exemple lors de l'activation) le fichier du plugin "core" ne sera pas requis .
gou1
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.