我知道这是一个老问题,但我想添加我自己的答案,我认为这可能会帮助一些用户实现同样的目标。
是的,使用本机WP-Ajax-API总是更好(也更容易),但它可能会变得非常慢,因为它会加载整个WP实例。
My solution: 非常简单,应该可以检索root
wordpress安装的。在执行自定义AJAX调用的任何脚本中,只需确保首先将脚本注册到wp_register_script()
(暂时不要排队)。然后使用wp_localize_script()
并分析ABSPATH
(这是一个在wp-load.php
并将保留根路径)。现在,您可以在脚本中检索此内容,并将其与AJAX调用一起解析。最后,当然要确保实际将脚本排队wp_enqueue_script()
.
Example:
下面的PHP代码片段将把您的
script.js
文件,并允许您检索
root
通过调用dir
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();
Please keep in mind that the wp_root
can be altered client side.
As a side note:
另一个你们中的一些人可能没有意识到的技巧是
wp-load.php
您可以定义一个名为
SHORTINIT
(布尔)。这将告诉WordPress只需加载基本功能(意味着您将丢失许多WP核心功能),但它将加快加载时间,因为它不会包含常规WP实例所需的所有文件。这个
SHORTINIT
在内部定义
wp-settings.php
(只需打开文件并查找
SHORTINIT
. 你将更好地了解引擎盖下发生的事情。这个巧妙的技巧将进一步加快加载速度(在我的测试中,加载速度比前一段时间提高了75%)。但这将取决于WP版本。还要记住
wp-load.php
WP版本的新版本会频繁更改,因此如果您使用
SHORTINIT
请确保您的脚本即使在未来版本的WordPress中也能正常工作,并且在较低版本的WordPress中也能正常工作。简而言之,如果你做的事情很复杂,需要依赖大量的WordPress codex,那么请确保
NOT 设置
SHORTINIT
到
true.