2015-09-05 7 views
5

Schnell gesagt, ich versuche, ein "Öko-System" mit WordPress zu bauen, wo ich ein Kern-Plugin und dann zusätzliche Add-on-Plugins habe.WordPress PSR-4 Namespaced Plugin Zugriff auf ein anderes Namespaced Plugin

Detaillierter, jedes Add-On-Plug-In erfordert das Kern-Plug-in zu funktionieren. Ich habe dies mit WordPress Standard-Kodierung und Dateistruktur Praktiken erreicht. Ich bin Überarbeitung dieses Projekt jetzt von Namensräumen PSR-4, Komponist, Bower und etc.

Standard-Wordpress-Installation

| 
|__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 

Core-Plugin PSR4 über Komponist

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

verwenden Beispielkernplugin Klasse

<?php 

namespace CorePlugin\library; 

class Post_Register { 

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

    private init() { 

    } 

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

} 

Erste Add-on-Plugin PSR4 über Komponisten

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

Klasse aus einer Add-on-Plugin

Unten ist, wo ich bin verwirrt. Ich versuche, eine Klasse aus dem Kern-Plugin in einem anderen Namespace zu verwenden, und ich erhalte die Fehlermeldung:

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

Beide Plugins AutoLoad- ihren jeweiligen Komponisten automatisches Laden von Dateien erzeugen, so dachte ich, würde ich in der Lage sein zu use die Namespaces. Ich kam hierher, um zu fragen, bevor ich mich mit diesem Teil des PHP-Handbuchs beschäftige (http://php.net/manual/en/language.namespaces.php), in dem ich vielleicht den Unter-Namensraum ausprobieren würde.

<?php 

namespace FirstAddon; 

use CorePlugin\Library\Post_Register; 

class First_Addon { 

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

    private init() { 

    } 

    private another_function() { 

    } 

} 

Außerdem bin ich zögerlich die Unter Namespacing mit Klammern zu verwenden, da zum Beispiel in Laravel, use foo \ bar; und use bar \ foo; so.

<?php namespace App\Services; 

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

class Registrar implements RegistrarContract { 

Antwort

0

Ich bin sicher, Sie haben von diesem bewegt, aber ich dachte, dass ich auf jeden Fall beantworten würde, falls andere versuchen Plugins voneinander abhängig sind zu haben. Ich benutze Klassen und Namespaces in meinen Plugins. Meine Plugins verwenden die Klassen des jeweils anderen.

Namensräume Plugins

Erstens ist es im Grunde kommt es auf die Reihenfolge, in der Wordpress-Plugins lädt. Ich kam selbst von C#/Java und war zunächst verwirrt darüber, wie WP Dinge gemacht hat. Sie möchten sicherstellen, dass das Plugin, das Sie verwenden möchten, bereits geladen ist. Der beste Weg, dies zu tun ist, die Klasse über einen späten Hook zu instantiieren - eine, von der Sie wissen, dass sie nach dem Laden von Plugins passiert.Ein Beispiel hierfür könnte

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

sein und hat dann den Konstruktor, die Klasse in der anderen Plugin verwenden (oder wo auch immer Sie sie brauchen):

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

Abhängigkeiten

Wenn Plugins auf jedem abhängig sind andere, und muss je nachdem welche Plugins aktiviert sind und was nicht, können Sie dies tun:

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

Zuerst stellt es sicher, dass die von uns benötigte Funktion geladen ist, und prüft dann, ob das entsprechende Plugin aktiviert ist.

Autoloader

Es ist erwähnenswert, dass ich das in Autoloader gebaut verwenden:

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

.., die meine Klasse abbildet Namenskonvention von my_class an den Dateinamen my-Class.php

Es Alles funktioniert wunderbar.

Hoffe, dass jemand hilft.