รับ 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)) . "/";

ความคิดอื่นที่ฉันเล่นด้วยคือการมีคลาสซิงเกิลตันเพิ่มเติมที่เก็บการตั้งค่าทั้งหมดสำหรับปลั๊กอินและเพิ่มเลเยอร์สิ่งที่เป็นนามธรรมผ่านไฟล์คลาส

ความช่วยเหลือใด ๆ ที่ชื่นชมอย่างมาก

คำตอบ:


16

ในไดเรกทอรีย่อยภายในไดเรกทอรีปลั๊กอินของคุณคุณสามารถใช้รหัสต่อไปนี้:

$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

@MikeiLL ฉันเพิ่งสร้างรหัสใหม่ ใช้ตัวโหลดอัตโนมัติเพื่อรวมคลาส :)
fuxia

ขอบคุณ. จำเป็นที่จะต้องให้ความรู้กับตัวเอง: php-autoloader.malkusch.de/en ปลั๊กอินนี้จะถึงกำหนดอีกครั้งในเร็ว ๆ นี้ และบางหน่วยทดสอบ
MikeiLL

1
@MikeiLL ลองคนนี้ ดูคำอธิบายเกี่ยวกับรหัสตรวจสอบ
fuxia
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.