Plugin trong thư mục symlinked?


20

Khi tôi phát triển các plugin, tôi đã kiểm tra chúng trên nhiều phiên bản WordPress bằng cách liên kết thư mục plugin của tôi trong các wp-contentthư mục khác nhau . Điều này thật tuyệt vì tôi chỉ phải chỉnh sửa các tệp một lần, nhưng nó phá vỡ một cấu trúc quan trọng để tạo tham chiếu đến các tài nguyên trong plugin của tôi: __FILE__đề cập đến vị trí plugin vật lý, không phải là vị trí trong plugin wp-content. Làm thế nào tôi nên giải quyết điều này?

Cấu trúc thư mục của tôi trông như thế này:

  • /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 như một liên kết đến các plugin trên
      • 3.1-multi-dir/
        • wp-content/
          • plugins/
            • monkeyman-rewrite-analyzer như một liên kết đến các plugin trên
      • 3.1-multi-domain/
        • wp-content/
          • plugins/
            • monkeyman-rewrite-analyzer như một liên kết đến các plugin trên

Nếu tôi muốn xử lý tệp Javascript, tôi nên sử dụng plugins_url( 'monkeyman-rewrite-analyzer.js', [base file] ), nhưng sử dụng __FILE__ở đây sẽ không hoạt động, vì đường dẫn tệp thực tế sẽ /path/to/wordpress/development/dir/plugin-development/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.phpkhông /path/to/wordpress/development/dir/versions/*/wp-content/plugins/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.php, vì vậy WordPress không thể loại bỏ phần đầu tiên và tạo URL liên quan đến cài đặt WordPress.

Câu trả lời:


6

Vấn đề có thể được giải quyết một phần với một plugin phải sử dụng móc vào plugins_urlbộ lọc.

Nó sẽ không xử lý tất cả các trường hợp khác plugin_basename()được sử dụng, chẳng hạn như register_activation_hook()và đồng.

Thông tin thêm: http://core.trac.wordpress.org/ticket/16953


Tôi tin rằng việc sử dụng WP_PLUGIN_URLkhông được khuyến khích vì quản trị viên nên được phép thay đổi tên của thư mục plugin cụ thể này, nhưng cũng có một lý do khác để tránh nó? Và thực sự, vé của bạn sẽ là một giải pháp đơn giản.
Jan Fabry

Trái lại. WP_PLUGIN_URL chỉ chứa URL trỏ trực tiếp đến thư mục 'plugin'. Xem câu trả lời cập nhật.
scribu

@ fouu: Nhưng nếu các plugin của tôi tồn tại /external/folder/banana-plugin/nhưng quản trị viên liên kết đến thư mục đó thì /httpd-root/wp-content/plugins/apple-plugin/sao? Rồi nó sẽ cố đi /wp-content/plugins/banana-plugin/, phải không? Và tôi tin rằng quản trị viên nên được tự do chọn tên thư mục plugin riêng lẻ?
Jan Fabry

Tôi sẽ không tranh luận với bạn về điều đó nữa, vì tôi đã tìm ra giải pháp: bộ lọc 'plugins_url'. Cập nhật câu trả lời một lần nữa.
scribu

FWIW giải pháp này có thể dễ bị lỗi và phụ thuộc vào các nhà phát triển plugin chỉ sử dụng plugins_url () sau khi tất cả các plugin đã được tải, nếu không bạn không thể đăng ký bộ lọc trước khi hàm được gọi. Plugin Akismet và nhiều người khác có vấn đề đó.
jerclarke

3

Tôi hiện đang sử dụng một mẹo để có được vị trí tệp liên quan đến WordPress: wp_get_active_and_valid_plugins()trả về các đường dẫn tệp và wp_settings.phplặp lại chúng và bao gồm các tệp . Vì vậy, $pluginbiến toàn cục sẽ đề cập đến plugin hiện tại của bạn (tất nhiên chỉ khi plugin được tải, vì vậy tôi lưu nó trong biến toàn cầu có tiền tố):

$monkeyman_Rewrite_Analyzer_file = $plugin;

Bởi vì các plugin cũng có thể được tải dưới dạng phải sử dụng hoặc các plugin mạng và các vòng lặp này sử dụng các tên biến khác , mã hoàn chỉnh trông như thế này:

$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;
}

Dự phòng vẫn còn __FILE__, vì vậy nếu ai đó thay đổi tên biến vòng lặp trong tương lai, mã của tôi vẫn hoạt động với 99% tất cả các cài đặt, chỉ có thiết lập phát triển của tôi sẽ thất bại và tôi có thể phát hành phiên bản mới một cách dễ dàng.


Giải pháp tuyệt vời @Jan. Tôi đã thực hiện một cái gì đó tương tự bằng cách gọi các hàm và lặp bởi vì tôi quên những biến đó có thể truy cập được global. Nhờ bài viết của bạn ở đây tôi nhận ra tôi có thể làm cho nó đơn giản hơn nhiều. BTW, tôi cũng đang kiểm tra false === strpos( __FILE__, WP_CONTENT_DIR )trước khi chạy các câu lệnh if của bạn bởi vì tôi giả sử nếu plugin không nằm trong liên kết WP_CONTENT_DIRđó; Tôi hy vọng đó là logic hợp lệ.
MikeSchinkel

0

Một nhận xét trong lỗi 46260 đề nghị sử dụng $_SERVER["SCRIPT_FILENAME"]thay vì __FILE__. Nó có hoạt động không?


1
Không, điều này không thay đổi trong các tập tin bao gồm. Vì vậy, nếu index.phpbao gồm library.php, $_SERVER['SCRIPT_FILENAME']trong library.phpvẫn sẽ được index.php. Nhưng cảm ơn bạn đã tham khảo lỗi, tôi sẽ theo dõi sát sao!
Jan Fabry

0

$_SERVER["SCRIPT_FILENAME"]hoạt động nếu bạn sử dụng đúng. Bạn chỉ cần sử dụng nó để đặt đường dẫn cơ sở, sau đó bao gồm các tệp của bạn bằng cách sử dụng đường dẫn có liên quan đến đường dẫn cơ sở đó.

Cái gì đó như:

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

Lưu ý, điều này hữu ích hơn khi bạn chưa có quyền truy cập vào wp-blog-header.php (nghĩa là trong việc xử lý yêu cầu biểu mẫu dựa trên ajax)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.