2014-03-19 3 views
1

현재 플러그인의 모든 기능을 사용하는 방법을 아는 사람이 있습니까? 그것이 선언 한 함수들만?현재 플러그인의 모든 기능 가져 오기

나는 함수 get_defined_functions()에 대해 알고 그것을 시도했지만이 함수는 모든 함수의 목록을 가져 왔지만 현재 플러그인에서만 필요했습니다. 아마도 WP에는 플러그인에서 모든 기능을 사용할 수있는 기능이 있습니까?

물론 우리는 다음과 같은 방법으로 함수의 이름을 얻을 수 있지만 플러그인이 다른 파일을 포함 할 수 있고 함수를 가져올 수 없기 때문에 최선의 방법은 아닙니다.

$filename = __FILE__; 
$matches = array(); 
preg_match_all('/function\s+(\w*)\s*\(/', file_get_contents($filename), $matches); 
$matches = $matches[1]; 
+0

링크의 함수는 현재 파일에서만 함수를 가져옵니다. 현재 파일에는 다른 많은 파일이 포함될 수 있습니다! 그리고이 함수는 모든 함수를 가진 배열을 얻지 못합니다. 나는 WP를 사용한다. 플러그인을 설치하고 공간을 확보 할 때 플러그인을 추가합니다. 모든 플러그인에 대한 함수 목록을 가져와야합니다. 일부는 아닙니다. – Brotheryura

+0

예, 죄송합니다, 나는 그 부분을 잘못 읽었습니다 :/나는 가까운 투표를 철회 할 것입니다; upvote는 내 btw입니다. 그 함수는 모든 함수의 목록을 가진 배열을 얻고 있기 때문에 솔루션의 일부입니다 *'$ arr = get_defined_functions_in_file (plugin_dir_path (__FILE__)); var_dump ($ arr); ' – brasofilo

답변

2

다음 코드는이 Q & A의 기반으로합니다

그냥 테스트 그리고 그것은 모든 WP 페이지에있는 모든 PHP 파일과 그 기능 (전면 및 백엔드) 덤프. 코드는 현재 플러그인 디렉토리 내의 모든 PHP 파일을 찾고 각 파일 기능을 검색합니다.

add_action('plugins_loaded', function() { 
    $path = plugin_dir_path(__FILE__); 
    $it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)); 
    foreach ($it as $file) { 
     $ext = pathinfo($file, PATHINFO_EXTENSION); 
     if('php' === $ext) { 
      echo "<br><br>".$file."<br>"; 
      $arr = get_defined_functions_in_file($file); 
      var_dump ($arr); 
     } 
    } 
}); 


/* From https://stackoverflow.com/a/2197870 */ 
function get_defined_functions_in_file($file) { 
    $source = file_get_contents($file); 
    $tokens = token_get_all($source); 

    $functions = array(); 
    $nextStringIsFunc = false; 
    $inClass = false; 
    $bracesCount = 0; 

    foreach($tokens as $token) { 
     switch($token[0]) { 
      case T_CLASS: 
       $inClass = true; 
       break; 
      case T_FUNCTION: 
       if(!$inClass) $nextStringIsFunc = true; 
       break; 

      case T_STRING: 
       if($nextStringIsFunc) { 
        $nextStringIsFunc = false; 
        $functions[] = $token[1]; 
       } 
       break; 

      // Anonymous functions 
      case '(': 
      case ';': 
       $nextStringIsFunc = false; 
       break; 

      // Exclude Classes 
      case '{': 
       if($inClass) $bracesCount++; 
       break; 

      case '}': 
       if($inClass) { 
        $bracesCount--; 
        if($bracesCount === 0) $inClass = false; 
       } 
       break; 
     } 
    } 

    return $functions; 
} 
+0

위대한! 나를 위해 그것은 충분할 것이다! 고맙습니다! – Brotheryura