web-dev-qa-db-ja.com

第三者を置く場所 PHP としょうかん?

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

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

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

8
gou1

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

それを要求する前に、それがサードパーティのライブラリからのクラスまたは関数が存在するかどうかを確認するだけです。

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

または

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

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

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

5
chrisguitarguy

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

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

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'が呼び出されない場合、他のコードは何もしません。

3
fuxia

あなたのライブラリが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');
1
webaware

公式のベンダのディレクトリは存在しません 、私はライブラリを含むこと以外何もしない "コア"プラグインを探します。それからあなたはあなたのプラグインにそのコアプラグインを要求させるようにします。

あなたの本当のプラグインの1つにライブラリを置くことは、たとえ彼らがその機能を使いたくないかもしれないとしても、そのプラグインを有効にすることをユーザーに要求するでしょう。別のコアプラグインがきれいに見えます。

それを直接wp-contentに入れることは最悪の解決策のように見えます。

0
Geert