Я знаю, что это старый вопрос, но хотел добавить свой собственный ответ, который, я думаю, мог бы помочь некоторым пользователям, пытающимся достичь того же самого.
Да, всегда лучше (и проще) использовать собственный API Ajax WP, но он может стать очень медленным, поскольку загружает весь экземпляр WP.
Мое решение: довольно просто, и должно работать, чтобы получить root
установку WordPress. В каком бы скрипте вы ни выполняли пользовательский вызов AJAX, просто убедитесь, что вы сначала зарегистрировали скрипт wp_register_script()
(пока не ставьте его в очередь). Затем используйте wp_localize_script()
и проанализируйте ABSPATH
(это константа, которая определена внутри wp-load.php
и будет содержать корневой путь). Теперь вы можете получить это внутри вашего скрипта и проанализировать его вместе с вызовом AJAX. И, наконец, конечно, убедитесь, что сценарий действительно поставлен в очередь wp_enqueue_script()
.
Пример:
Приведенный ниже фрагмент PHP ставит в очередь ваш script.js
файл и позволяет вам получить каталог root
путем вызова pluginslug_scriptname_i18n.wp_root
. В основном wp_localize_script()
это используется для выполнения переводов, но это также удобно для анализа данных в ваших сценариях, которые вы получили на стороне сервера.
$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 );
Вы script.js
могли бы выглядеть так:
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);
Теперь внутри вашего ajax-handler.php
вы можете получить wp_content_dir
и загрузить его wp-load.php
так:
// 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();
Пожалуйста, имейте в виду, что wp_root
клиент может быть изменен.
Как примечание стороны:
Еще одна хитрость, о которой некоторые из вас могут не знать, это то, что перед включением wp-load.php
вы можете определить константу с именем SHORTINIT
(булево). Это скажет WordPress просто загрузить основы (то есть вы потеряете много функций ядра WP), но это ускорит время загрузки, поскольку не будет включать все необходимые файлы для обычного экземпляра WP. Он SHORTINIT
определен внутри wp-settings.php
(просто откройте файл и поищите SHORTINIT
. У вас будет лучшее понимание того, что происходит под капотом. Этот изящный прием ускорит время загрузки еще больше (до 75% в моих тестах, которые я делал). Некоторое время назад.) Но это будет зависеть от версии WP. Также имейте в виду, что wp-load.php
изменения часто происходят с новыми выпусками версий WP, поэтому, если вы используетеSHORTINIT
будьте уверены, что ваш скрипт всегда будет работать даже в будущих версиях WordPress, а также с более низкой версией WordPress. Короче говоря, если вы делаете сложные вещи, основанные на большом количестве кодекса WordPress, убедитесь, что НЕ установлено SHORTINIT
значение true .