私はこれが古い質問であることを知っていますが、同じことを達成しようとしている一部のユーザーに役立つかもしれないと思う自分の答えを追加したいと思いました。
はい、常にネイティブ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に真。