Admin-ajax.phpが大好きです。しかし、私はフロントエンドのスクリプトをそれに向けるためにローカライズしなければならないことを嫌います、そして私はテーマのための同等の、見つけやすいファイルがあったことを望みます。 (フロントエンドのリクエストが "/ wp-admin /"を通過するのを見るのも煩わしいです。実用的な理由はなく、醜いIMOに見えます。)
そこで、単純にadmin-ajax.phpを "/ajax.php"のルートディレクトリにコピーし、インクルードパスを調整し、WP_ADMIN定数定義を削除しました。ギャングバスターのように動作しているようです(フロントエンドのAJAXリクエストはすべて/ajax.phpに送信することができます!そして、通常のwp_ajaxフックをプラグインで使用することもできます)。
しかし、これは安全ですか?何が悪いのだろうか?これはコアに組み込まれていないので、そうではないという理由には正当な理由があると思います。しかし、コードを見てみると、当面の問題はわかりません。
あなたは頭がいいです - このアプローチがおかしいかどうか教えてください。あるいは私が見逃しているより簡単な方法があるなら。
通常のパーマリンクの書き換え規則の上にあなたの.htaccessにRewriteRuleを使うことができます:
RewriteRule ^ajax$ /wp-admin/admin-ajax.php [L]
それではAJAXリクエストをexample.com/ajax
に送ってください。そしてアップグレード後にそのファイルへのコアな変更を見逃すことはありません。
まず: 標準化。コミュニティプラグインを使用する予定の場合は、ドキュメントルートにある/ajax.php
ファイルを気にする必要はないでしょう。だから彼らはそれを使わないでしょう。
自分ですべてをロールバックするつもりなら、これは問題ではありません。
第二: コアが更新されたら?あなたのajaxファイルを監視したり変更したりしますか?
第3 :admin-ajax.php
がwp-admin
に常駐しているにもかかわらず、管理領域のもの(例えばリストテーブルなど)をロードしません。認証をチェックしたり、ログインしていないユーザーに敏感なものを公開したりすることもありません。つまり、フロントエンドファイルのようなものです。何も心配する必要はありません。
第四: 最初の問題に関連して、いくつかのプラグインは盲目的にajax関連の機能をロードする前にチェックするでしょう。例を以下に示します。あなたの修正されたajax.phpはおそらくそれをロードさせないでしょう。
<?php
if (is_admin() && defined('DOING_AJAX') && DOING_AJAX) {
// load ajax stuff
}
最後に: あなたが不満を言っていること、Ajax URLを取得するためにローカライズを使うのは良いことです。どうして?なぜなら、あなたのJSファイルはサーバーサイドのものを意識していないからです。あなたは、サイトが動いたときにURLが壊れるのを固くしようとしていますか?悪い選択のようです。
Ajaxを使用するすべてのスクリプトをローカライズしたくない場合は、本当に早い段階でwp_head
にフックして、管理Ajax URLを吐き出してください。問題は解決しました(ところで、これはまさに管理領域のやり方です)。
<?php
add_action('wp_head', 'wpse83650_lazy_ajax', 0, 0);
function wpse83650_lazy_ajax()
{
?>
<script type="text/javascript">
/* <![CDATA[ */
var ajax_url = "<?php echo esc_js(admin_url('admin-ajax.php')); ?>";
/* ]]> */
</script>
<?php
}
WordPressの多くのことと同じように、猫の皮をむく方法はほぼ無限にあります。受け入れられているすべてのメソッドは動作しますが、フロントエンドにajax機能を含めるために wp_localize_script を使用するよりも、それらが「きれい」ではないことがわかりました。
これをチェックしてください。
add_action( 'wp_enqueue_scripts', 'se83650_js' );
function se83650_js()
{
wp_enqueue_script( 'se83650-js', plugin_dir_url( __FILE__ ) . 'js/se83650.js', 'jquery', '1.0.0', true );
// First param is the name of the script you are attaching it to - in this case
// it is the name of the custom script we added. Second param is the name of
// the javscript Object that will be attached with your information.
// Third param is an array of attributes, in this case, ajaxurl
wp_localize_script( 'se83650-js', 'se83650Ajax',
array(
// You can put any variables here you want for your script
// such as plugin-specific variables or nonces, etc.
'ajaxurl' => admin_url( 'admin-ajax.php' )
)
);
}
そしてse83650.js
ファイルでは、変数をse83650Ajax.ajaxurl
で参照します。
この手法の利点は、この機能を試して複製する多くのプラグインがある場合、それらが同じ変数を含めたり上書きしたりしないことです。 ajaxurl
は含めるのがかなり一般的です、これはあなたをもっと閉じ込めさせるでしょう、そしてそれは他の開発者と一緒にもっとうまく働きます。