Saya tahu ini adalah pertanyaan lama tetapi ingin menambahkan jawaban saya sendiri yang saya pikir dapat membantu beberapa pengguna mencoba mencapai hal yang sama.
Ya itu selalu lebih baik (dan lebih mudah) untuk menggunakan WP Ajax API asli, tetapi bisa menjadi sangat lambat karena memuat seluruh contoh WP.
Solusi saya: cukup sederhana, dan harus berfungsi untuk mengambil root
instalasi wordpress. Dalam skrip apa pun yang Anda lakukan panggilan AJAX kustom, pastikan Anda pertama kali mendaftarkan skrip dengan wp_register_script()
(jangan enqueue dulu). Kemudian gunakan wp_localize_script()
dan parsing ABSPATH
(ini adalah konstanta yang didefinisikan di dalam wp-load.php
dan akan menahan path root). Anda sekarang dapat mengambil ini di dalam skrip Anda dan menguraikannya bersama dengan panggilan AJAX. Akhirnya tentu saja pastikan untuk benar-benar membuat skrip dengan wp_enqueue_script()
.
Contoh:
Cuplikan PHP di bawah ini akan membuat script.js
file Anda enqueue , dan memungkinkan Anda untuk mengambil root
dir dengan menelepon pluginslug_scriptname_i18n.wp_root
. Pada dasarnya wp_localize_script()
ini digunakan untuk melakukan terjemahan, tetapi ini juga berguna untuk mem-parsing data ke skrip Anda yang diambil dari sisi server.
$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 );
Anda script.js
bisa terlihat seperti ini:
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);
Sekarang di dalam Anda, ajax-handler.php
Anda dapat mengambil wp_content_dir
dan memuat wp-load.php
seperti Anda :
// 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();
Harap diingat bahwa wp_root
sisi klien dapat diubah.
Sebagai catatan:
Trik lain yang beberapa dari Anda mungkin tidak sadari adalah bahwa sebelum termasuk wp-load.php
Anda dapat mendefinisikan konstanta disebut SHORTINIT
(boolean). Ini akan memberi tahu WordPress untuk hanya memuat dasar-dasarnya (artinya Anda akan kehilangan banyak fungsi inti WP) tetapi itu akan mempercepat waktu pemuatan karena tidak akan menyertakan semua file yang diperlukan untuk instance WP biasa. The SHORTINIT
dalam didefinisikan wp-settings.php
(hanya membuka file dan mencari SHORTINIT
. Anda akan memiliki pemahaman yang lebih baik tentang apa yang terjadi di bawah tenda. Trik bagus ini akan mempercepat beban kali bahkan lebih (sampai 75% dalam tes saya yang saya lakukan beberapa waktu yang lalu) .Tapi ini akan tergantung pada versi WP. Juga perlu diingat bahwa wp-load.php
perubahan sering dengan rilis baru versi WP, jadi jika Anda menggunakanSHORTINIT
pastikan bahwa skrip Anda akan selalu berfungsi bahkan di versi WordPress yang akan datang, dan juga dengan versi WordPress yang lebih rendah. Singkatnya, jika Anda melakukan hal-hal kompleks yang bergantung pada banyak kodeks WordPress, maka pastikan TIDAK diatur SHORTINIT
ke true .