2012-12-13 19 views
9

Tôi đang cố gắng để đảo ngược-kỹ sư một plugin: http://wordpress.org/extend/plugins/wordpress-social-login/Wordpress wp-load.php

Trong một phần của nó, có dòng này:
(tôi có một thời gian khó khăn để hiểu người đầu tiên, phần còn lại chỉ đơn giản là có để tham khảo nếu họ có một cái gì đó để làm điều đó.)

require_once(dirname(dirname(dirname(dirname(__FILE__)))) . '/wp-load.php'); 

define('WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL', plugins_url() . '/' . basename(dirname(__FILE__))); 
define('WORDPRESS_SOCIAL_LOGIN_HYBRIDAUTH_ENDPOINT_URL', WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL . '/hybridauth/'); 

câu hỏi của tôi là ... những gì chính xác là trong tập tin này wp-load.php rằng nó cần phải được theo yêu cầu của mã? Bằng cách nhìn vào nó, tất cả những gì tôi hiểu là nó tải các tệp wordpress cốt lõi quan trọng để trang web chạy đúng (functions.php, wp-settings.php, wp-config.php etc ...)
Thực tế là plugin chạy đã có nghĩa là wp-load.php được tải ?
Ngoài ra nó còn lãng phí tài nguyên vì nó bao gồm rất nhiều tệp có thể bao gồm các tệp khác và nó giống như một vòng lặp vô tận của các tệp được yêu cầu, mỗi tệp khác, được tải hai lần .. (hoặc thậm chí nhiều hơn nếu các plugin khác sử dụng loại phương pháp này quá)

Vậy chính xác nó sẽ làm gì?

P.S; Tất cả những gì tôi tìm thấy bởi Google-ing là CÁCH để đưa nó chính xác (vì đường dẫn có thể thay đổi) - nhưng đó không phải là vấn đề/câu hỏi của tôi.

Trả lời

23

Câu hỏi của tôi là ... chính xác trong số này wp-load.php tệp nào mà mã này cần phải có?

Tất cả chức năng chính của WordPress. Điều này bao gồm các tệp chủ đề, tất cả các tệp của plugin hoạt động, v.v. NHƯNG tải WordPress theo cách này không phân tích cú pháp URL được yêu cầu và không chạy truy vấn WordPress (bằng cách khởi tạo đối tượng WP, cũng như đối tượng WP_Query) .

Bằng cách nhìn vào nó, tất cả tôi hiểu là nó tải lõi file wordpress rất quan trọng cho các trang web để được chạy một cách chính xác (functions.php, wp-settings.php, wp-config.php vv ...)

Có, bạn' đã hiểu chính xác.

Thực tế là plugin chạy đã có nghĩa là tải tệp wp-load.php?

Nếu mã plugin được gọi bởi WordPress (ví dụ để hiển thị trang quản trị hoặc tệp được chèn vào tệp plugin ban đầu) - thì có nghĩa là wp-load.php đã được tải.

Đôi khi, các plugin yêu cầu trực tiếp các tệp đơn lẻ (ví dụ http://example.com/wp-content/plugins/my-plugin/sample.php), thay vì một số trang hỗ trợ WordPress (ví dụ: http://example.com/?my_plugin_action=sample hoặc http://example.com/wp-admin/admin-ajax.php).

Xem cách URL đầu tiên tham chiếu đến tệp cụ thể trong thư mục plugin my-plugin và thư mục thứ hai chuyển đến trang chủ của trang web có đối số truy vấn cụ thể được thêm vào hoặc ví dụ thứ ba, trong đó tệp được tham chiếu là admin-ajax.phpwp-admin thư mục - đây là một tập tin đặc biệt, mà làm cho nó dễ dàng cho các plugin để thực hiện yêu cầu AJAX (tập tin này cũng tải lõi WordPress và cháy một số móc hành động). Trong trường hợp tham chiếu đầu tiên, nếu plugin muốn sử dụng một số chức năng WordPress (để tham khảo cơ sở dữ liệu, thao tác bài đăng, v.v.), cần tải các tệp lõi WordPress bằng cách bao gồm wp-load.php.

Cũng là một nguồn tài nguyên hoàn toàn vì nó bao gồm rất nhiều tệp có thể bao gồm các tệp khác và nó giống như một vòng lặp vô tận các tệp được yêu cầu, mỗi tệp khác, đang được tải hai lần .. (hoặc thậm chí hơn nếu các plugin khác sử dụng loại phương pháp quá)

Lưu ý _once gia require_once(... - điều này nói với PHP để bao gồm các tập tin chỉnếu nó chưa được bao gồm rồi. Do đó không có xung đột nào xảy ra, và không quá nhiều bộ nhớ sẽ được PHP sử dụng. Mặc dù - nếu bạn đang ở trong một bối cảnh mà WordPress đã được bắt đầu, bạn không nên gọi hàm require.


Vì vậy, về cơ bản tác giả plugin mong đợi một số yêu cầu được thực hiện đối với tệp plugin mà bạn tìm thấy mã này. Vì tác giả muốn sử dụng chức năng WordPress trong tệp này, anh ta gọi tệp wp-load.php để tải các chức năng chính. Tôi giả sử, điều này được thực hiện để giảm tải trên máy chủ, mặc dù với một vài móc chạy trên móc hành động plugins_loaded và thông số tùy chỉnh $_GET được thêm vào url trang chủ, kết quả vẫn phải đẹp gần.

Cá nhân tôi thích tùy chọn thứ hai, nhưng như tôi đã nói, bao gồm wp-load.phpsẽ ngăn WordPress chạy một số nội dung phức tạp (phân tích URL và truy vấn cơ sở dữ liệu/ies).

Nếu vẫn còn điều gì đó, bạn không hoàn toàn hiểu về điều đó - hãy đăng nhận xét ở đây và tôi sẽ cố giải thích thêm.

+1

Câu trả lời tuyệt vời, chi tiết! Cảm ơn bạn rất nhiều! :) – Asaf

4

Từ những gì tôi đọc chúng thường bao gồm tải wp trong các plugin khi sử dụng cơ sở dữ liệu là cần thiết, nhưng đây là một lựa chọn không tốt vì nó gây ra rất nhiều vấn đề. Bạn có thể thấy một số điều có liên quan ở đây: http://ottodestruct.com/blog/2010/dont-include-wp-load-please/ (nếu liên kết này là bao giờ bị xóa, See that page here)

1

Có lẽ một tấm séc đúp.

require_once() có nghĩa là nếu nó đã được tải, sau đó nó sẽ không tải lại.

1

wp-load.php là một cách để tải WP từ tập lệnh bên ngoài, cho phép sử dụng chức năng WP trong số các tính năng khác.

Nhưng, như bạn nói, điều đó không cần thiết vì nó là một plugin. Tuy nhiên, bạn không giải thích bạn đã tìm mã ở đâu trong câu hỏi của mình, bởi vì wp-load.php thực sự cần thiết cho các trang hoặc tập lệnh phía trước nằm trong một thư mục khác với thư mục của biểu định kiểu, ngay cả khi chúng là một phần của cắm vào.

Các trang plugin trong khu vực quản trị không phải tải lại WP vì nó đã được tải, nhưng các trang đầu trang phải tải nó.

Tóm lại, có một số lý do để bao gồm wp-load.php để có quyền truy cập vào các chức năng và biến của WP.

2

wp-load.php chịu trách nhiệm khởi động môi trường WordPress giúp plugin có thể sử dụng chức năng WordPress Core gốc.

Bây giờ như đối với

Không thực tế là các plugin chạy đã có nghĩa là wp-load.php được nạp?

Không hề!

Nếu bạn truy cập tệp plugin trực tiếp, điều đó không có nghĩa là bạn có toàn bộ môi trường WordPress và bạn không thể sử dụng các chức năng chính của bản gốc trừ khi bạn bao gồm wp-load.php.

1

Điều này sẽ bao gồm wp-load.php nếu chưa được tải nếu tệp nằm ở bất kỳ đâu, bất kể cấp độ nào, trong thư mục nội dung wp.

if(!defined(ABSPATH)){ 
    $pagePath = explode('/wp-content/', dirname(__FILE__)); 
    include_once(str_replace('wp-content/' , '', $pagePath[0] . '/wp-load.php')); 
} 
+0

Không phải là cố gắng lấy nó từ thư mục wp-content? Tại sao nó lại ở trong đó? Nó ở gốc, thường là ít nhất. –