从插件深处获取plugin_dir_url()


13

我使用该结构编写了几个插件:

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

以便利用面向对象和整体结构我的代码

从类文件中,有时我需要获取基本插件的URL ...我一直在使用以下内容,但是我敢肯定有更好的方法:

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

我玩弄的另一个想法是有一个额外的单例类,用于存储插件的所有设置,并通过类文件添加抽象层。

任何帮助是极大的赞赏。

Answers:


16

在插件目录内的子目录中,可以使用以下代码:

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

7

您应该使所有类与它们的实际位置无关,以便您可以轻松地将它们移动,甚至可以在其他项目中重用它们。

我将创建一个告诉其他类使用什么路径或URL的类,让它实现一个接口,以便您甚至可以在主题中或完全不在WordPress中重用其他类。

接口示例:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.