web-dev-qa-db-ja.com

フロントエンドにadmin-ajax.phpを追加します。良い考えか悪い考えか?

Admin-ajax.phpが大好きです。しかし、私はフロントエンドのスクリプトをそれに向けるためにローカライズしなければならないことを嫌います、そして私はテーマのための同等の、見つけやすいファイルがあったことを望みます。 (フロントエンドのリクエストが "/ wp-admin /"を通過するのを見るのも煩わしいです。実用的な理由はなく、醜いIMOに見えます。)

そこで、単純にadmin-ajax.phpを "/ajax.php"のルートディレクトリにコピーし、インクルードパスを調整し、WP_ADMIN定数定義を削除しました。ギャングバスターのように動作しているようです(フロントエンドのAJAXリクエストはすべて/ajax.phpに送信することができます!そして、通常のwp_ajaxフックをプラグインで使用することもできます)。

しかし、これは安全ですか?何が悪いのだろうか?これはコアに組み込まれていないので、そうではないという理由には正当な理由があると思います。しかし、コードを見てみると、当面の問題はわかりません。

あなたは頭がいいです - このアプローチがおかしいかどうか教えてください。あるいは私が見逃しているより簡単な方法があるなら。

16
MathSmath

通常のパーマリンクの書き換え規則の上にあなたの.htaccessにRewriteRuleを使うことができます:

RewriteRule ^ajax$ /wp-admin/admin-ajax.php [L]

それではAJAXリクエストをexample.com/ajaxに送ってください。そしてアップグレード後にそのファイルへのコアな変更を見逃すことはありません。

17
fuxia

まず: 標準化。コミュニティプラグインを使用する予定の場合は、ドキュメントルートにある/ajax.phpファイルを気にする必要はないでしょう。だから彼らはそれを使わないでしょう。

自分ですべてをロールバックするつもりなら、これは問題ではありません。

第二: コアが更新されたら?あなたのajaxファイルを監視したり変更したりしますか?

第3 admin-ajax.phpwp-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
}
6
chrisguitarguy

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は含めるのがかなり一般的です、これはあなたをもっと閉じ込めさせるでしょう、そしてそれは他の開発者と一緒にもっとうまく働きます。

5
bybloggers