Tôi biết đây là một câu hỏi cũ nhưng muốn thêm câu trả lời của riêng tôi mà tôi nghĩ có thể giúp một số người dùng cố gắng đạt được điều tương tự.
Đúng, luôn luôn tốt hơn (và dễ dàng hơn) để sử dụng API WP Ajax gốc, nhưng nó có thể trở nên rất chậm vì nó tải toàn bộ cá thể WP.
Giải pháp của tôi: khá đơn giản và nên hoạt động để lấy root
cài đặt wordpress. Trong bất kỳ tập lệnh nào bạn đang thực hiện cuộc gọi AJAX tùy chỉnh, chỉ cần đảm bảo rằng trước tiên bạn đăng ký tập lệnh với wp_register_script()
(chưa thực hiện nó). Sau đó sử dụng wp_localize_script()
và phân tích cú pháp ABSPATH
(đây là một hằng số được xác định bên trong wp-load.php
và sẽ giữ đường dẫn gốc). Bây giờ bạn có thể truy xuất tệp này trong tập lệnh của mình và phân tích cú pháp cùng với lệnh gọi AJAX. Cuối cùng tất nhiên hãy chắc chắn để thực sự mê hoặc kịch bản với wp_enqueue_script()
.
Thí dụ:
Đoạn mã PHP dưới đây sẽ liệt kê script.js
tệp của bạn và cho phép bạn truy xuất root
thư mục bằng cách gọi pluginslug_scriptname_i18n.wp_root
. Về cơ bản, wp_localize_script()
được sử dụng để thực hiện các bản dịch, nhưng điều này cũng trở nên hữu ích để phân tích dữ liệu vào (các) tập lệnh mà bạn đã truy xuất phía máy chủ.
$handle = 'pluginslug-scriptname'; // Set script handle
$name = str_replace( '-', '_', $handle ) . '_i18n'; // Will convert handle to pluginslug_scriptname_i18n
wp_register_script( $handle, plugin_dir_url( __FILE__ ) . 'script.js', array(), '1.0.0', false );
wp_localize_script(
$handle,
$name,
array(
'ajax_url' => plugin_dir_url( __FILE__ ) . 'ajax-handler.php', // @THIS WILL HOLD YOUR AJAX URL :) To retrieve this inside your script.js simply call: pluginslug_scriptname_i18n.ajax_url
'wp_root' => ABSPATH // @THIS WILL HOLD THE ROOT PATH :) To retrieve this inside your script.js simply call: pluginslug_scriptname_i18n.wp_root
)
);
wp_enqueue_script( $handle );
Bạn script.js
có thể trông như thế này:
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 ){
if (this.status == 200) {
// Success:
}
// Complete:
}
};
xhttp.onerror = function () {
console.log(this);
console.log("** An error occurred during the transaction");
};
xhttp.open("POST", pluginslug_scriptname_i18n.ajax_url, true);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
var params = JSON.stringify({
first_name: 'Johny',
wp_root: pluginslug_scriptname_i18n.wp_root
});
xhttp.send(params);
Bây giờ bên trong ajax-handler.php
bạn có thể lấy wp_content_dir
và tải wp-load.php
như thế:
// Set proper content type
header('Content-Type: text/html');
// Disable caching
header('Cache-Control: no-cache');
header('Pragma: no-cache');
// Get's the payload
$request_body = json_decode( file_get_contents('php://input'), true );
// Set this to true to just load the basics!
// Only set this to true if you know what you are doing
// Lookup SHORTINIT inside wp-settings.php for more details
define( 'SHORTINIT', false );
// Include wp-load.php
require_once( $request_body['wp_root'] . 'wp-load.php' );
die();
Xin lưu ý rằng wp_root
phía khách hàng có thể được thay đổi.
Như một lưu ý phụ:
Một mẹo khác mà một số bạn có thể không biết là trước khi bao gồm wp-load.php
bạn có thể định nghĩa một hằng số được gọi là SHORTINIT
(boolean). Điều này sẽ bảo WordPress chỉ tải những điều cơ bản (có nghĩa là bạn sẽ mất rất nhiều chức năng cốt lõi của WP) nhưng nó sẽ tăng tốc thời gian tải vì nó sẽ không bao gồm tất cả các tệp cần thiết cho một phiên bản WP thông thường. Cái SHORTINIT
được xác định bên trong wp-settings.php
(chỉ cần mở tệp và tìm kiếm SHORTINIT
. Bạn sẽ hiểu rõ hơn về những gì đang xảy ra dưới mui xe. Thủ thuật tiện lợi này sẽ tăng tốc độ tải xuống nhiều hơn (tới 75% trong các thử nghiệm của tôi mà tôi đã làm cách đây một thời gian). Nhưng điều này sẽ phụ thuộc vào phiên bản WP. Ngoài ra, hãy nhớ rằng những wp-load.php
thay đổi thường xuyên với các phiên bản WP mới, vì vậy nếu bạn sử dụngSHORTINIT
hãy chắc chắn rằng tập lệnh của bạn sẽ luôn hoạt động ngay cả trong các phiên bản WordPress trong tương lai và cả với phiên bản thấp hơn của WordPress. Nói tóm lại, nếu bạn làm những việc phức tạp dựa vào rất nhiều bộ mã WordPress, thì hãy đảm bảo KHÔNG đặt SHORTINIT
thành đúng .