Wo soll die PHP-Bibliothek eines Drittanbieters abgelegt werden?

8

Ich entwickle ein paar Open-Source-Plugins und ein Thema (alle Teil einer "Suite"), die alle dieselbe PHP-Bibliothek eines Drittanbieters verwenden. Ich frage mich, wie ich es am besten in Wordpress aufnehmen kann. Hier sind einige Gedanken:

  • Fügen Sie es in eines der Plugins ein und erfordern Sie, dass das Plugin installiert und aktiviert ist
  • Erstellen Sie ein spezielles "Core" -Plugin, das nichts anderes tut, als es einzuschließen
  • setzen Sie es direkt in wp-content

Irgendwelche Gedanken dazu?

gou1
quelle
Ist diese Entwicklung für den privaten Gebrauch an einem Standort oder an mehreren Standorten / Veröffentlichung in der Öffentlichkeit vorgesehen?
Erster
Es ist für eine Reihe von Open Source Plugins. Ich aktualisiere die Frage, um darauf hinzuweisen.
Gou1

Antworten:

5

Wenn jedes Plugin / Theme für sich funktioniert, sollten Sie die Bibliothek wahrscheinlich in jedem Theme / Plugin löschen.

Überprüfen Sie dann einfach, ob eine Klasse oder Funktion aus der Bibliothek eines Drittanbieters vorhanden ist, bevor Sie sie anfordern.

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

oder

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

Alternativ können Sie jede Funktion / Klasse / Variable / Konstante aus der Bibliothek eines Drittanbieters überprüfen, um festzustellen, ob sie vorhanden ist, z. B. steckbare Funktionen .

Wenn alle Plugins und das Thema voneinander abhängig sind, ist es nicht sehr sinnvoll, sie aufzuteilen, und Sie sollten das wahrscheinlich überdenken.

chrisguitarguy
quelle
Plugins haben verschiedene Funktionen, daher die Trennung: Sie aktivieren nur das, was Sie wollen. Aber alles hängt von einem Framework ab, weshalb ich diese Bibliothek einbinden muss. Es hat einen Autoloader und einige Klassen, so dass das Überprüfen / Erfordernis für jede Klasse wirklich ein Schmerz wäre. Und ich kann es nicht wirklich in jeder Klasse fallen lassen, weil es den Autoloader mehrmals registrieren würde. Im Moment scheint die bessere Lösung das "Kern" -Plugin zu sein. Sie aktivieren es zuerst, damit alle Inhalte von Drittanbietern benötigt werden, und wählen dann die gewünschten Plugins aus.
Gou1
Sie denken falsch darüber nach: Erstellen Sie einfach eine Bootstrap-Datei, einschließlich etwas, das Sie überprüfen können und das alle Klassen enthält / erfordert. Dann benötigen Sie diese Datei. Ein Scheck. Verlassen Sie sich nicht darauf, dass Ihre Benutzer herausfinden, dass sie das zweite Plugin installieren müssen.
Chrisguitarguy
Das ist genau meine Frage: Unabhängig von der Methode (Plugin, Bootstrapper usw.), wo die Dateien abgelegt werden sollen?
Gou1
Oh, ich würde sie in einem libraryOrdner in jedem Plugin / Theme ablegen. Führen Sie dann in Ihrer Haupt-Plugin-Datei die Prüfung aus und fügen Sie sie gegebenenfalls hinzu.
Chrisguitarguy
3

Binden Sie den gesamten abhängigen Code an eine Aktion im Bibliotheks-Plugin.

Beispielcode für das Bibliotheks-Plugin:

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

Tun Sie in Ihrem abhängigen Code nichts, bevor die Aktion aufgerufen wurde:

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

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

Die Bibliothek verwaltet alle grundlegenden Teile: Überprüfen Sie die richtige PHP-Version, WordPress-Konstanten, Multi-Site-Setups usw.

Der andere Code führt nichts aus, wenn die Aktion 'library_loaded'nicht aufgerufen wird.

Fuxia
quelle
1

Wenn Ihre Bibliotheken die Form von PHP-Klassen haben, können Sie diese Klassen mit spl_autoload_register () laden, wenn sie noch nicht von einem anderen Plugin geladen wurden. Sie können die Bibliotheken dann in Ihrem Plugin bündeln und einfach verwenden, wobei Sie sich darauf verlassen können, dass der Klassenladeprogramm sie gegebenenfalls einschließt. Sie können auch den Klassenlader verwenden, um die Klassen Ihres eigenen Plugins zu laden.

z.B

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');
webaware
quelle
Das Problem hierbei ist nicht das automatische Laden, sondern "alle verwenden dieselbe PHP-Bibliothek eines Drittanbieters".
Gou1
1
Per chrisguitarguy könnte jeder seine eigene Kopie der Bibliothek haben und somit im Wesentlichen unabhängig arbeiten. Da jeder zum Betrieb aufgefordert wird und daher die Bibliothek benötigt, wird sie geladen, sofern sie noch nicht geladen wurde. Das automatische Laden von Klassen bietet lediglich eine bequeme Möglichkeit, das Bit "Laden, wenn es noch nicht geladen wurde" zu adressieren.
webaware
0

Da es kein offizielles Herstellerverzeichnis gibt , würde ich mich für das "Kern" -Plugin entscheiden, das nur die Bibliothek enthält. Sie stellen dann sicher, dass Ihre Plugins dieses Kern-Plugin benötigen.

Wenn Sie die Bibliothek in eines Ihrer echten Plugins einfügen möchten, muss der Benutzer dieses Plugin aktiviert haben, auch wenn er seine Funktionalität möglicherweise nie nutzen möchte. Ein separates Core-Plugin scheint sauberer zu sein.

Es direkt in wp-Inhalt zu setzen, scheint die schlechteste Lösung zu sein.

Geert
quelle
Das habe ich auch zuerst gedacht, aber ich habe herausgefunden, dass es nicht ausreicht, nur das Einbeziehen Ihrer Bibliotheken in ein aktiviertes Plugin zu packen: Manchmal (z. B. beim Aktivieren) wird die Datei des "Kern" -Plugins nicht benötigt .
Gou1