2015-09-05 22 views
5

すぐに言えば、私はコアプラグインと追加のプラグインがある場所でWordPressを使って 'エコシステム'を構築しようとしています。WordPress PSP-4名前空間プラグイン別の名前空間付きプラグインへのアクセス

各アドオンプラグインでは、コアプラグインが機能する必要があります。私はWordPressの標準コーディングとファイル構造を使ってこれを達成しました。私は今、名前空間PSR-4、作曲、バウアーを使用するには、このプロジェクトを再加工等

標準のWordPressの作曲

"autoload": { 
    "psr-4": { 
     "CorePlugin\\Library\\": "library" 
    } 
} 

経由

| 
|__www 
    | 
    |___wp-admin 
    | 
    |___wp-content 
    | | 
    | |___plugins 
    | | | 
    | | |___my-core-plugin 
    | | | | 
    | | | |___library 
    | | | | | 
    | | | | |___class-post-register.php 
    | | | | 
    | | | |___vendor 
    | | | | | 
    | | | | |___autoload.php 
    | | | | 
    | | | |___composer.json 
    | | | | 
    | | | |___core.php 
    | | | 
    | | |___my-first-addon-plugin 
    | | | | 
    | | | |___library 
    | | | | 
    | | | |___vendor 
    | | | | | 
    | | | | |___autoload.php 
    | | | | 
    | | | |___composer.json 
    | | | | 
    | | | |___core.php 
    | | | 
    | | |___my-second-addon-plugin 
    | | | | 
    | | | |___library 
    | | | | 
    | | | |___vendor 
    | | | | | 
    | | | | |___autoload.php 
    | | | | 
    | | | |___composer.json 
    | | | | 
    | | | |___core.php 
    | | | 
    | |___themes 
    | | | 
    | | |___my-custom-theme 
    | | 
    | wp-includes 

コア・プラグインのPSR4をインストールしていますコアプラグインクラスの例

<?php 

namespace CorePlugin\library; 

class Post_Register { 

    private __construct() { 
     // ... code 
    } 

    private init() { 

    } 

    private register($data) { 
     // .. code to register a custom post for example. 
    } 

} 

まずアドオンプラグインのPSR4作曲経由

"autoload": { 
    "psr-4": { 
     "FirstAddon\\Library\\": "library" 
    } 
} 

クラスをアドオンプラグイン以下

から、私は混乱しているところです。私は別の名前空間にコアプラグインからクラスを使用しようとしていると私はエラーを取得しています:私はuseにことができると思いますけれども

Fatal error: Class 'CorePlugin\Library\Post_Register' not found in...

は、どちらのプラグインは、それぞれの作曲は私ので、自動ロードファイルを生成AUTOLOAD名前空間。 PHPマニュアル(http://php.net/manual/en/language.namespaces.php)のこの部分を掘り下げる前に、私はここに来て、おそらくサブネームスペースを試してみることにしました。

<?php 

namespace FirstAddon; 

use CorePlugin\Library\Post_Register; 

class First_Addon { 

    private __construct() { 
     // ... code 
    } 

    private init() { 

    } 

    private another_function() { 

    } 

} 

また、私は、例えば、laravelで、useのfoo \バー、理由はブラケットでサブ名前空間を使用して躊躇しています。およびuseバー\ foo;そのようです。

<?php namespace App\Services; 

use App\User; 
use Validator; 
use Illuminate\Contracts\Auth\Registrar as RegistrarContract; 

class Registrar implements RegistrarContract { 

答えて

0

私はあなたがこの上から移動してきたが、私は、私はとにかく答えるだろうと思って、ケースには他の人はプラグインがお互いに依存していしようと確信しています。私はプラグインにクラスと名前空間を使用しています。私のプラグインはお互いのクラスを再利用します。

の名前空間のプラグイン

まず、それは基本的にそれはWordpressのは、あなたのプラグインをロードするためにダウンしています。私はC#/ Java自身から来て、WPが何をしたかで最初は混乱しました。使用するプラグインが既にロードされていることを確認する必要があります。これを行う最善の方法は、プラグインがロードされた後に起こることが分かっている遅延フックを介してクラスをインスタンス化することです。例は

add_action('plugins_loaded', function() { new whatever() }); 

可能性があり、その後、コンストラクタは、他のプラグインクラスを使用している(または、あなたがそれをどこを必要とする、これまで):

function __construct() { 
    $other_plugin_class = new \Namespace\To\Other\Plugin\MyClass(); 
} 

依存関係のプラグインは、それぞれに依存している場合

プラグインが有効になっているかどうかに応じて別の方法で対応する必要があります。

if (! function_exists('is_plugin_active')) 
    require_once(ABSPATH . '/wp-admin/includes/plugin.php'); 

if (is_admin() and is_plugin_active('myplugin1/plugin1.php')) { 
    add_action('admin_menu', array($this, 'add_a_menu_depending_on_another_plugin'), 99); 
} 

まず、必要な機能がロードされていることを確認し、関連するプラグインが有効かどうかを確認します。

オートローダー

それは私がオートローダーに組み込まれて使用することを言及する価値があります:

spl_autoload_register('my_autoloader'); 
function my_autoloader($class_name) { 
    if (false !== strpos($class_name, 'Nuvobook')) { 
    $classes_dir = plugin_dir_path(__DIR__); 
    $class_file = strtolower(str_replace('_', '-', str_replace('\\', DIRECTORY_SEPARATOR, $class_name)) . '.php'); 
    include_once $classes_dir . $class_file; 
    } 
} 

..ファイル名にMy_Classの私のクラスの命名規則をマッピングしている私の-Class.phpと

それすべてが素晴らしく動作します。

誰かを助ける希望。