플러그인 내 한 레벨 깊이에서 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을 알려주는 클래스를 만들고 인터페이스를 구현하여 테마에서 또는 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.