私はこれが古い質問であることを知っていますが、同じことを達成しようとしている一部のユーザーに役立つかもしれないと思う自分の答えを追加したいと思いました。
はい、常にネイティブWP Ajax APIを使用する方が優れています(そして簡単です)が、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
クライアント側で変更できることに注意してください。
補足として:
一部の人が気付かないかもしれないもう1つのトリックは、含める前に(ブール)wp-load.php
と呼ばれる定数を定義できることSHORTINIT
です。これはWordPressに基本をロードするように指示します(多くのWPコア機能を失うことを意味します)が、通常のWPインスタンスに必要なすべてのファイルが含まれていないため、ロード時間が短縮されます。SHORTINIT
内部に定義されているwp-settings.php
(ただのためのファイルや外観を開くSHORTINIT
。あなたはボンネットの下に何が起こっているかのより良い理解を持つことになります。この気の利いたトリックは、私がやったことを私のテストでは75%(さらにロード時間をスピードアップします少し前ですが、これはWPバージョンに依存します。またwp-load.php
、WPバージョンの新しいリリースでは頻繁に変更が行われるため、SHORTINIT
スクリプトは、WordPressの将来のバージョンでも、WordPressの下位バージョンでも常に機能することを確認してください。あなたは、WordPressのコーデックスの多くに依存している複雑なことを行う場合は要するに、その後に確認してくださいしない設定SHORTINIT
に真。