サードパーティのPHPライブラリをどこに置くか?


8

同じサードパーティのPHPライブラリをすべて使用する、いくつかのオープンソースプラグインとテーマ(すべて「スイート」の一部)を開発しています。私はそれをワードプレスに含めるための最良の方法は何だろうと思っています。ここにいくつかの考えがあります:

  • プラグインの1つに配置し、そのプラグインをインストールしてアクティブ化する必要がある
  • それを含める以外に何もしない特別な「コア」プラグインを作成する
  • 直接入れる wp-content

そのことについて何か考えはありますか?


これは、単一のサイトまたは複数のサイトでの私的使用のための開発ですか?公開リリースですか?
Rarst、2011年

オープンソースプラグインのスイート用です。それを指摘するために質問を更新しています。
gou1 2010年

回答:


5

各プラグイン/テーマがそれ自体で機能する場合は、ライブラリをすべてのテーマ/プラグインにドロップする必要があります。

次に、サードパーティライブラリのクラスまたは関数が存在するかどうかを確認してから、それを必要とします。

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

または

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

または、プラグイン可能な関数のように、サードパーティライブラリのすべての関数/クラス/変数/定数をチェックして、それが存在するかどうかを確認することもできます

すべてのプラグインとテーマが互いに依存している場合、それらを分割することは実際にはあまり意味がなく、おそらくそれを再考する必要があります。


プラグインにはさまざまな機能があるため、分離する必要があります。しかし、それはすべてフレームワークに依存しているため、そのライブラリを含める必要があります。オートローダーとかなりの数のクラスがあるので、すべてのクラスをチェック/要求するのは本当に面倒です。また、オートローダーを数回登録するため、すべてのクラスに実際にドロップすることはできません。現在、より良い解決策は「コア」プラグインのようです。最初にそれをアクティブにして、すべてのサードパーティのものを必要とし、次に必要なプラグインを選択します。
gou1 2011年

あなたはこれが間違っていると考えています:確認できるものを含め、すべてのクラスを含む/必要とするブートストラップファイルを作成するだけです。次に、そのファイルを要求します。1つのチェック。ユーザーが2番目のプラグインをインストールする必要があることを理解することを期待しないでください。
chrisguitarguy

それはまさに私の質問です:ファイルを配置する方法(プラグイン、ブートストラップなど)は何ですか?
gou1 2010年

ああ、私はそれらlibraryを各プラグイン/テーマのフォルダに入れます。次に、メインプラグインファイルでチェックを実行し、必要に応じてそれらを含めます。
chrisguitarguy

3

すべての依存コードをライブラリプラグインのアクションにバインドします。

ライブラリプラグインのサンプルコード:

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

依存するコードでは、アクションが呼び出される前は何もしません。

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

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

ライブラリはすべての基本的な部分を処理します。適切なPHPバージョン、WordPress定数、マルチサイト設定などを確認してください。

アクション'library_loaded'が呼び出されない場合、他のコードは何もしません。


1

ライブラリがPHPクラスの形式である場合、chrisguitarguyによる回答に加えて、spl_autoload_register()を使用して、別のプラグインによってまだロードされていないクラスをロードできます。次に、ライブラリをプラグインにバンドルしてそれらを使用し、必要に応じてクラスローダーを使用してそれらを含めることができます。クラスローダーを使用して、独自のプラグインのクラスをロードすることもできます。

例えば

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

ここでの問題は自動読み込みではなく、「すべて同じサードパーティのPHPライブラリを使用する」ことです。
gou1 2013

1
chrisguitarguyごとに、それぞれが独自のライブラリのコピーを持つことができるため、基本的に独立して動作します。それぞれが動作するように要求され、したがってライブラリが必要になると、まだロードされていない場合はライブラリをロードします。クラスのオートロードは、「まだロードされていない場合はロードする」ビットに対処する便利な方法を提供するだけです。
webaware

0

以来公式ベンダーのディレクトリが存在しない、私は何もしない「コア」のプラグインのために行くが、ライブラリが含まれます。次に、プラグインにそのコアプラグインを要求させます。

ライブラリを実際のプラグインの1つに配置するには、ユーザーはその機能を使用したくない場合でも、そのプラグインを有効にする必要があります。別個のコアプラグインはよりクリーンに見えます。

wp-contentに直接配置することは、最悪のソリューションのように見えます。


それも私が最初に考えていたものですが、ライブラリを1つのアクティブ化されたプラグインに含めるだけでは十分ではないことがわかりました。 。
gou1 2010年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.