0

필자는 WordPress에서 사용할 PHP로 작성된 오토로더 클래스에 이상한 문제가 있습니다.PHP 자동로드 및 워드 프레스

핵심 개념은 자녀 테마, 부모 테마 또는 플러그인인지 여부에 관계없이 클래스를로드해야한다는 것입니다. 이름을 기반으로 클래스를 찾아야합니다 (폴더 구조와 관련 있음). CoreTheme_Folder_SubFolder_ClassName(){} = CoreTheme/Folder/SubFolder/ClassName.php

하위 테마 및 상위 테마에서 잘 작동합니다. 하위 테마에는 function.php라는 상위 테마가 포함되어 있습니다. autoloader를 사용하여 자식 테마의 부모 테마 클래스를 호출 할 수 있으며 require_once()의 무리가없는 경우

플러그인에서 동일한 개념을 수행 할 때 문제가 발생합니다. of the zend)를 테마의 루트에 포함 시키십시오. 해당 테마가 활성화되어 있고 플러그인에서 오토로더를 설정하면 "이 오토로더의 두 인스턴스가 있습니다. 뭐하시는 겁니까?"라고 말하면서 speles를 실행합니다. 비활성화하면 그때 테마로 말했다. 자동 로더를 플러그인에 넣으면, 배 명명법 표준을 사용하여 만드는 모든 클래스를 찾을 수 없습니다.

WordPress와 PHP를 모두 더 잘 이해하고있는 분에게 저의 질문입니다. 필자의 테마, 하위 테마 또는 플러그인에 상관없이 필자가 찾고있는 클래스를 항상 찾을 수 있도록 필자의 오토로더를 어떻게 만듭니 까?

아래 코드는 자동 로더 클래스입니다. 당신이 꺼낼 경우 : plugin_dir_path(__FILE__) 그러면 자동 로더가 테마와 해당 하위 테마의 모든 클래스를로드합니다.

class AisisCore_Loader_AutoLoader{ 

    protected static $_instance; 

    protected static $_directories; 

    public function get_instance(){ 
     if(null == self::$_instance){ 
      self::$_instance = new self(); 
     } 

     self::$_directories = array(
      get_template_directory(), 
      get_stylesheet_directory(), 
      plugin_dir_path(__FILE__), 
     ); 

     return self::$_instance; 
    } 

    public function reset_instance(){ 
     self::$_instance = null; 
    } 

    public function register_auto_loader(){ 
     spl_autoload_register(array($this, 'load_class')); 
    } 

    public function load_class($class){ 
     $path = str_replace('_', '/', $class); 
     foreach(self::$_directories as $directories){ 
      if(file_exists($directories . '/' . $path . '.php')){ 
       require_once($directories . '/' . $path . '.php'); 
      } 
     } 
    } 
} 

이 클래스를 통해 부모 functions.php에서 인스턴스화 :

// Load the autoloader. 
require_once(get_template_directory() . '/AisisCore/Loader/AutoLoader.php'); 

// Setup the autoloader. 
$auto_loader = AisisCore_Loader_AutoLoader::get_instance(); 
$auto_loader->register_auto_loader(); 

그리고 자식 테마 당신이해야 할 모든은 다음과 같습니다

require_once(TEMPLATEPATH . '/functions.php'); 

이 오토로더 수 있습니다 자녀와 부모 모두를 대상으로 일한다. 주된 문제는 플러그인을 만들 때 플러그인의 이름 루트 디렉토리에 프레임 워크 사본을 넣는 것입니다 : plugins/myplugin/AisisCore/과 테마 (부모) 중 하나 Themes/MyTheme/AisisCore

그래서 나는 그것이 왜곡 될지 알 수 있습니다 , 거기에 방법이 있습니까?

+0

'plugin_dir_path (__ FILE __)'이 틀릴 수도 있습니다. 또한 싱글 톤을 필요로하지 않고 디렉토리를 추가 할 수있게 허용하면 실행시 새 플러그인 또는 테마 디렉토리를 등록 할 수 있습니다. 대신 Wordpress에서 잘 작동하는 추상 클래스를 사용하십시오. @hakre가 [귀하의 이전 질문] (http://stackoverflow.com/q/15534211/2261774)에서 제안했습니다. –

+0

실제로 함수가 WordPress에 명시된 바와 같이 정확합니다. 전체 앱이 충돌하지 않으면 클래스의 구현이 올바르게 작동합니다. 즉, 추상 클래스의 이점은 볼 수 없지만 그 점에 대해 감사합니다.). 여기서 문제는 액티브 한 테마가 AisisCore 라이브러리를 가지고 있다면 그것이 괴롭히는 것입니다. 여기서 문제는 : http://wordpress.stackexchange.com/questions/95742/am-i-not-understanding-plugins는 플러그인의 플러그인 디렉토리에 아무것도 표시하지 않는 자동 로더에 대한 것입니다. – TheWebs

+0

오토로더가 플러그인 또는 테마 내부에서 초기화되면 조건부로 확인하십시오. 이 문제를 조금 해결해야합니다 (그렇게하면서 유용한 정보를 배우게됩니다). 그리고'plugin_dir_path (__ FILE __)'은 faker입니다. '__FILE__ '이 무엇인지 조심하십시오. 소스를보십시오 : http://core.trac.wordpress.org/browser/tags/3.5.1/wp-includes/plugin.php#L577 –

답변

0

난 당신이 하나 개의 클래스를로드 할 생각, 그래서이

public function load_class($class){ 
    $path = str_replace('_', '/', $class); 
    foreach(self::$_directories as $directories){ 
     if(file_exists($directories . '/' . $path . '.php')){ 
      require_once($directories . '/' . $path . '.php'); 
      return; 
     } 
    } 
} 

같은 return;를 사용하거나 다른 여러 클래스를로드합니다. 이것을 확인하십시오 : http://php.net/return