Nhận plugin_dir_url () từ một cấp độ sâu trong plugin


13

Tôi đã viết một số bổ sung bằng cách sử dụng cấu trúc:

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

Vì vậy, để tận dụng lợi thế của OO và cấu trúc tổng thể mã của tôi

Từ trong tệp lớp, có những lúc tôi cần lấy URL của plugin cơ sở ... Tôi đã sử dụng các cách sau, nhưng tôi chắc chắn có một cách tốt hơn:

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

Một ý tưởng khác mà tôi đã chơi là có thêm một lớp singleton lưu trữ tất cả các cài đặt cho plugin và thêm một lớp trừu tượng thông qua các tệp lớp.

Bất kỳ trợ giúp nào cũng được đánh giá rất cao.

Câu trả lời:


16

Trong thư mục con trong thư mục plugin của bạn, bạn có thể sử dụng mã sau:

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

7

Bạn nên làm cho tất cả các lớp học của bạn độc lập với vị trí thực tế của chúng, để bạn có thể di chuyển chúng dễ dàng và có thể tái sử dụng chúng trong các dự án khác.

Tôi sẽ tạo một lớp cho các lớp khác biết đường dẫn hoặc URL sẽ sử dụng, để nó thực hiện giao diện để bạn có thể sử dụng lại các lớp khác ngay cả trong một chủ đề hoặc hoàn toàn bên ngoài WordPress.

Ví dụ cho giao diện:

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

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

Việc triển khai cụ thể trong plugin của bạn có thể trông như thế này:

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

Bây giờ bạn tạo một thể hiện của lớp đó trong tệp plugin chính của mình:

$address = new PluginDirectoryAddress( __DIR__ );

Và tất cả các lớp khác chỉ có một phụ thuộc vào giao diện trong hàm tạo của chúng, như thế này:

public function __construct( DirectoryAddress $directory ) {}

Họ đang truy cập URL và đường dẫn chỉ từ phiên bản được thông qua ngay bây giờ.


Sau đó, class.Plugin_Controller.phpsẽ cần phải được yêu cầu bởi các tập tin trong thư mục cao hơn, đúng không?
MikeiLL

@MikeiLL Tôi vừa tái cấu trúc mã. Sử dụng một trình tải tự động để bao gồm các lớp. :)
fuxia

Cảm ơn bạn. Cần phải tự học: php-autoloader.malkusch.de/en . Plugin này là do tái cấu trúc sớm. Và một số bài kiểm tra đơn vị.
MikeiLL

1
@MikeiLL Hãy thử cái này . Xem giải thích về Đánh giá mã .
fuxia
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.