2015-09-05 4 views
5

जल्दी से डालें, मैं वर्डप्रेस का उपयोग करके 'इको-सिस्टम' बनाने की कोशिश कर रहा हूं जहां मेरे पास कोर प्लगइन है और फिर अतिरिक्त ऐड-ऑन प्लगइन्स हैं।वर्डप्रेस पीएसआर -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" 
    } 
} 

कक्षा वह जगह है जहाँ मैं उलझन में हूँ। मैं एक अलग नाम स्थान में कोर प्लगइन से एक वर्ग का उपयोग करने की कोशिश कर रहा हूँ और मैं त्रुटि हो रही है:

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

दोनों प्लगइन्स AutoLoad उनके संबंधित संगीतकार autoload फ़ाइलें उत्पन्न तो मैं हालांकि मैं use करने में सक्षम हो जाएगा नामस्थान मैं 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

मुझे यकीन है कि आप इस पर स्थानांतरित किया है हूँ, लेकिन मैंने सोचा कि मैं वैसे भी जवाब देने के चाहते हैं, में मामला दूसरों प्लगइन्स एक दूसरे पर निर्भर है करने के लिए प्रयास करें। मैं अपने प्लगइन में कक्षाओं और नामस्थानों का उपयोग करता हूं। मेरे प्लगइन्स एक-दूसरे के वर्गों का पुन: उपयोग करते हैं।

namespaced प्लगइन्स

सबसे पहले, यह मूल रूप से यह नीचे जिस क्रम में Wordpress आपके प्लग इन को लोड करता है की बात आती है। मैं स्वयं सी #/जावा से आया था, और शुरुआत में उलझन में था कि डब्ल्यूपी ने चीजें कैसे कीं। आप यह सुनिश्चित करना चाहते हैं कि आप जिस प्लगइन का उपयोग करना चाहते हैं, पहले ही लोड हो चुका है। ऐसा करने का सबसे अच्छा तरीका है कि देर से हुक के माध्यम से कक्षा को तुरंत चालू करना - जिसे आप जानते हैं प्लगइन लोड होने के बाद होता है।एक उदाहरण

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

सबसे पहले यह सुनिश्चित करता है कि हमें जिस फ़ंक्शन की आवश्यकता है उसे लोड किया गया है, और तब जांच करता है कि प्रासंगिक प्लगइन सक्षम है या नहीं।

Autoloader

यह उल्लेख के लायक है कि मैं autoloader में बनाया का उपयोग करें:

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

यह सभी अद्भुत काम करता है।

उम्मीद है कि किसी की मदद करता है।

संबंधित मुद्दे