2015-09-05 11 views
5

In breve, sto cercando di creare un 'eco-sistema' utilizzando WordPress, dove ho un plug-in di base e quindi plug-in aggiuntivi aggiuntivi.WordPress PSR-4 Plugin Names Accessing Un altro plug-in Namespaced

Più in dettaglio, ciascun plug-in aggiuntivo richiede il funzionamento del plug-in principale. Ho raggiunto questo obiettivo utilizzando la codifica standard di WordPress e le pratiche di struttura dei file. Sto rielaborando questo progetto usare per ora namespacing PSR-4, compositore, gazebo e ecc

standard di WordPress Installare

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

Nucleo plug psr4 via compositore

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

Esempio di nucleo plug-in di classe

<?php 

namespace CorePlugin\library; 

class Post_Register { 

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

    private init() { 

    } 

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

} 

primo add-on plug psr4 via compositore

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

classe da un add-on plug

Qui di seguito è dove sono confuso. Sto cercando di usare una classe dal plugin di base in uno spazio dei nomi diverso e sto ottenendo l'errore:

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

Entrambi i plugin autoload loro rispettivo compositore generare file autoload così ho pensato che sarei in grado di use i namespace Sono venuto qui per chiedere prima di approfondire questa parte del manuale PHP (http://php.net/manual/en/language.namespaces.php) dove potrei provare il sotto namespace forse.

<?php 

namespace FirstAddon; 

use CorePlugin\Library\Post_Register; 

class First_Addon { 

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

    private init() { 

    } 

    private another_function() { 

    } 

} 

Inoltre, sono riluttanti a utilizzare il sub namespacing con staffe a causa, per esempio, in laravel, use foo \ bar; e use bar \ pippo; così.

<?php namespace App\Services; 

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

class Registrar implements RegistrarContract { 

risposta

0

Sono sicuro che hai spostato su questo, ma ho pensato di rispondere in ogni modo, nel caso in cui gli altri cercare di avere i plugin dipendono l'uno dall'altro. Uso classi e spazi dei nomi nei miei plugin. I miei plugin riutilizzano le lezioni l'uno dell'altro.

namespace plugin

In primo luogo, in fondo si tratta di l'ordine in cui Wordpress carica i tuoi plugin. Sono venuto da C#/Java me stesso, e inizialmente ero confuso da come WP ha fatto le cose. Vuoi assicurarti che il plugin che desideri utilizzare sia già caricato. Il modo migliore per farlo è quello di creare un'istanza della classe tramite un hook tardivo, uno che si verifica quando i plugin vengono caricati.Un esempio potrebbe essere

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

e quindi hanno il costruttore di utilizzare la classe in un altro plug-in (o dove mai ne avete bisogno):

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

Dipendenze

Se i plugin sono dipendenti l'uno altro, e deve agire in modo diverso a seconda di quali plug-in sono abilitati e quali no, è possibile farlo:

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

Prima si assicura che la funzione di cui abbiamo bisogno sia caricata, e quindi controlla se il plugin pertinente è abilitato.

caricatore automatico

Vale la pena ricordare che io uso il costruito nel caricatore automatico:

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

.. che mappa la mia classe di convenzione di denominazione del my_class al nome del file my-class.php

E ' tutto funziona meravigliosamente.

La speranza che aiuta qualcuno.