प्लगइन के भीतर एक स्तर से plugin_dir_url () प्राप्त करें


13

मैंने संरचना का उपयोग करते हुए कई प्लगइन्स लिखे हैं:

/plugins/myplugin/myplugin.php /plugins/myplugin/class/class-myclass.php

तो OO का लाभ उठाने के लिए और समग्र रूप से मेरे कोड को संरचित करना

कक्षा फ़ाइल के भीतर से कई बार मुझे आधार प्लगइन का URL प्राप्त करने की आवश्यकता होती है ... मैं निम्नलिखित का उपयोग कर रहा हूं, लेकिन मुझे यकीन है कि एक बेहतर तरीका है:

$this->plugin_location = substr(plugin_dir_url(__FILE__),0, strrpos(plugin_dir_url(__FILE__), "/",-2)) . "/";

एक और विचार जिसके साथ मुझे जोड़ा गया था वह एक अतिरिक्त एकल वर्ग था जो प्लगइन के लिए सभी सेटिंग्स को संग्रहीत करता है और कक्षा फ़ाइलों के माध्यम से एक अमूर्त परत को जोड़ता है।

कोई भी मदद बहुत ही सराहनीय होगी।

जवाबों:


17

अपने प्लगइन निर्देशिका के भीतर एक उपनिर्देशिका में आप निम्नलिखित कोड का उपयोग कर सकते हैं:

$this->plugin_location = plugin_dir_url(dirname(__FILE__));

7

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

मैं एक ऐसी कक्षा बनाऊंगा जो अन्य वर्गों को बताती है कि किस पथ या URL का उपयोग करना है, इसे एक इंटरफ़ेस लागू करें ताकि आप अन्य वर्गों को शायद किसी विषय या वर्डप्रेस के बाहर भी पुनः उपयोग कर सकें।

इंटरफ़ेस के लिए उदाहरण:

interface DirectoryAddress
{
    /**
     * @return string Dir URL with trailing slash
     */
    public function url();

    /**
     * @return string Dir path with trailing slash
     */
    public function path();
}

आपके प्लगइन में ठोस कार्यान्वयन इस तरह दिख सकता है:

class PluginDirectoryAddress implements DirectoryAddress
{
    private $path;

    private $url;

    public function __construct( $dirpath )
    {
        $this->url  = plugins_url( '/', $dirpath );
        $this->path = plugin_dir_path( $dirpath );
    }

    /**
     * @return string Dir URL with trailing slash
     */
    public function url() {
        return $this->url;
    }

    /**
     * @return string Dir path without trailing slash
     */
    public function path() {
        return $this->path;
    }
}

अब आप अपनी मुख्य प्लगइन फ़ाइल में उस वर्ग का एक उदाहरण बनाते हैं:

$address = new PluginDirectoryAddress( __DIR__ );

और अन्य सभी वर्गों के पास उनके निर्माता के इंटरफेस पर निर्भरता है, जैसे:

public function __construct( DirectoryAddress $directory ) {}

वे अभी दिए गए उदाहरण से केवल URL और पथ को एक्सेस कर रहे हैं।


फिर class.Plugin_Controller.phpउच्च निर्देशिका में फ़ाइल द्वारा आवश्यक होने की आवश्यकता है, सही?
मिकीएलएल

@MikeiLL मैंने अभी कोड को रिफलेक्ट किया है। कक्षा को शामिल करने के लिए एक ऑटोलैडर का उपयोग करें। :)
FUXIA

धन्यवाद। खुद को शिक्षित करने की आवश्यकता है: php-autoloader.malkusch.de/en । इस प्लगइन जल्द ही एक refactoring के लिए है। और कुछ इकाई परीक्षण।
मिकीएलएल

1
@MikeiLL प्रयास करें यह एककोड समीक्षा पर स्पष्टीकरण देखें ।
FUXIA
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.