심볼릭 링크 된 디렉토리의 플러그인?


20

플러그인을 개발할 때 플러그인 디렉토리를 다른 wp-content디렉토리 에 심볼릭 링크하여 여러 버전의 WordPress에서 테스트합니다 . 파일을 한 번만 편집해야하기 때문에 훌륭하지만 플러그인의 리소스에 대한 참조를 생성하는 중요한 구성을 __FILE__깨뜨 wp-content립니다. 이 문제를 어떻게 해결해야합니까?

내 디렉토리 구조는 다음과 같습니다

  • /path/to/wordpress/development/dir/
    • plugin-development/
      • monkeyman-rewrite-analyzer/
        • monkeyman-rewrite-analyzer.php
        • js/
          • monkeyman-rewrite-analyzer.js
    • versions/
      • 3.1/
        • wp-content/
          • plugins/
            • monkeyman-rewrite-analyzer 위 플러그인에 대한 심볼릭 링크
      • 3.1-multi-dir/
        • wp-content/
          • plugins/
            • monkeyman-rewrite-analyzer 위 플러그인에 대한 심볼릭 링크
      • 3.1-multi-domain/
        • wp-content/
          • plugins/
            • monkeyman-rewrite-analyzer 위 플러그인에 대한 심볼릭 링크

나는 자바 스크립트 파일을 대기열에하고 싶은 경우에, 나는 사용해야 plugins_url( 'monkeyman-rewrite-analyzer.js', [base file] )하지만 사용하여 __FILE__실제 파일 경로가되기 때문에, 여기 없어 일을 할 /path/to/wordpress/development/dir/plugin-development/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.php수 없습니다, /path/to/wordpress/development/dir/versions/*/wp-content/plugins/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.php워드 프레스는 첫 번째 부분을 제거하고, 워드 프레스 설치에 대한 상대 URL을 생성 할 수 있습니다.

답변:


6

plugins_url필터에 꼭 필요한 플러그인 후킹으로 문제를 부분적으로 해결할 수 있습니다 .

co plugin_basename()와 같은 다른 모든 경우를 처리하지는 않습니다 register_activation_hook().

추가 정보 : http://core.trac.wordpress.org/ticket/16953


WP_PLUGIN_URL관리자 가이 특정 플러그인 디렉토리의 이름을 변경할 수 있어야하기 때문에 사용 하지 않는 것이 좋습니다.하지만 피해야 할 또 다른 이유가 있습니까? 실제로 티켓은 간단한 솔루션이 될 것입니다.
Jan Fabry

반대로. WP_PLUGIN_URL에는 'plugins'디렉토리를 직접 가리키는 URL 만 포함됩니다. 업데이트 된 답변을 참조하십시오.
scribu

@scribu :하지만 내 플러그인이 /external/folder/banana-plugin/있지만 관리자가 해당 디렉토리에 링크하면 /httpd-root/wp-content/plugins/apple-plugin/어떻게됩니까? 그런 다음에 가려고합니다 /wp-content/plugins/banana-plugin/. 그리고 관리자가 개별 플러그인 디렉토리 이름을 자유롭게 선택할 수 있어야한다고 생각합니까?
Jan Fabry

해결책을 찾았 기 때문에 더 이상 그것에 대해 논쟁하지 않을 것입니다 : 'plugins_url'필터. 답변을 다시 업데이트했습니다.
scribu

이 솔루션은 오류가 발생하기 쉬우 며 모든 플러그인이로드 된 후에 만 ​​plugins_url ()을 사용하는 플러그인 개발자에 의존합니다. 그렇지 않으면 함수가 호출되기 전에 필터를 등록 할 수 없습니다. Akismet 플러그인과 다른 많은 사람들이 그 문제를 가지고 있습니다.
jerclarke

3

나는 현재 WordPress 상대 파일 위치를 얻는 트릭을 사용합니다 : wp_get_active_and_valid_plugins()파일 경로를 반환하고 그 경로를 wp_settings.php반복하고 파일을 포함합니다 . 따라서 전역 $plugin변수는 현재 플러그인을 참조합니다 (물론 플러그인이로드 될 때만 접두사가 붙은 전역 변수에 저장합니다).

$monkeyman_Rewrite_Analyzer_file = $plugin;

플러그인은 필수 플러그인 또는 네트워크 플러그인으로로드 할 수 있으며 이러한 루프는 다른 변수 이름을 사용 하므로 전체 코드는 다음과 같습니다.

$monkeyman_Rewrite_Analyzer_file = __FILE__;
if ( isset( $mu_plugin ) ) {
    $monkeyman_Rewrite_Analyzer_file = $mu_plugin;
}
if ( isset( $network_plugin ) ) {
    $monkeyman_Rewrite_Analyzer_file = $network_plugin;
}
if ( isset( $plugin ) ) {
    $monkeyman_Rewrite_Analyzer_file = $plugin;
}

폴백은 여전히 ​​남아 __FILE__누군가 미래에 루프 변수 이름을 변경하면 내 코드가 여전히 모든 설치의 99 %에서 작동해야합니다. 개발 설정 만 실패하고 새 버전을 쉽게 릴리스 할 수 있습니다.


훌륭한 솔루션 @Jan. 함수를 호출하고 루핑하여 비슷한 변수를 액세스 할 수 없기 때문에 비슷한 것을 구현했습니다 global. 귀하의 게시물 덕분에 훨씬 간단하게 만들 수 있음을 깨달았습니다. BTW, 나는 false === strpos( __FILE__, WP_CONTENT_DIR )플러그인이 WP_CONTENT_DIR심볼릭 링크되어 있지 않다고 가정하기 때문에 if 문을 실행하기 전에 테스트 하고 있습니다 . 나는 그것이 유효한 논리이기를 바라고있다.
MikeSchinkel

0

버그 46260 의 의견은 $_SERVER["SCRIPT_FILENAME"]대신에 사용하는 것이 좋습니다 __FILE__. 이 작동합니까?


1
아니요, 이것은 포함 된 파일에서 변경되지 않습니다. 그렇다면 index.php포함 library.php, $_SERVER['SCRIPT_FILENAME']library.php의지 여전히 index.php. 그러나 버그에 대한 참조에 감사드립니다. 자세히 살펴 보겠습니다.
Jan Fabry

0

$_SERVER["SCRIPT_FILENAME"]올바르게 사용하면 작동합니다. 이를 사용하여 기본 경로를 설정 한 다음 해당 기본 경로에 상대적인 경로를 사용하여 파일을 포함시켜야합니다.

다음과 같은 것 :

$plugin_dir = dirname($_SERVER["SCRIPT_FILENAME"]);
$myFile = $plugin_dir."/includes/js/myJavascriptFile.js";

이것은 wp-blog-header.php에 아직 액세스 할 수 없을 때 (즉, 아약스 기반 양식 요청을 처리 할 때) 더 유용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.