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


17

admin-ajax.phpが大好きです。しかし、フロントエンドスクリプトを指すためにローカライズする必要はありません。テーマに対応する、見つけやすいファイルがあればいいのにと思います。(また、フロントエンドのリクエストが "/ wp-admin /"を通過するのを見るのも面倒です。実用的な理由はなく、,いIMOに見えます。)

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

しかし、これは安全ですか?何がおかしいのでしょうか?これはコアに組み込まれていないので、なぜそうならないのかについて十分な理由があると思います。しかし、コードを見てみると、差し迫った問題は見当たりません。

あなたは賢いです。このアプローチがおかしいなら教えてください。または、私が見落としているより簡単な方法がある場合。


自動更新中にこのファイルを忘れて見逃す可能性があります。これにより、セキュリティ上の脆弱性が破壊され、そのまま残る可能性があります。
ヘム

回答:


19

通常のパーマリンク書き換えルールよりも上の.htaccessに対してRewriteRuleを使用できます。

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

ここでAJAXリクエストをに送信しexample.com/ajax、アップグレード後にそのファイルへの主要な変更を見逃さないでください。


いい案!それを聞いた後、「それはとても簡単で明白だ!」ありがとう。
MathSmath

私はあなたの提案に従って書き換えルールを追加しましたが、example.com/ajaxURL 404のものです。.htaccessこれをどこに追加すればよいかについて詳しく説明してください。私は現在# BEGIN WordPress <IfModule mod_rewrite.c></IfModule> # END WordPress
ジョン

これは動作します。末尾のスラッシュがありませんでした。/%postname%/に設定されたパーマリンクがあります
ジョン

7

最初:標準化。コミュニティプラグインの使用を計画している場合/ajax.phpは、ドキュメントルートのファイルを気にしない可能性があります。したがって、彼らはそれを使用しません。

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

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

3番目:にadmin-ajax.php常駐しているwp-adminにもかかわらず、管理領域のもの(リストテーブルなど)をロードしません。また、認証をチェックしたり、ログインしていないユーザーに影響を受けやすいものを公開したりしません。つまり、フロントエンドファイルのようなものです。心配する必要はありません。

4番目:最初の問題に関連して、一部のプラグインはajax関連の機能を盲目的に読み込む前にチェックします。以下に例を示します。変更したajax.phpは、おそらくそれをロードしません。

<?php
if (is_admin() && defined('DOING_AJAX') && DOING_AJAX) {
    //  load ajax stuff
}

最後に:、ローカライズを使用してAjax URLを取得するのは良いことです。どうして?あなたのJSファイルはサーバー側のものを認識していないからです。サイトが移動した場合/移動したときに壊れるURLをハードにしようとしていますか?悪い選択のようです。

Ajaxを使用するすべてのスクリプトをローカライズしたくない場合は、簡単にフックしwp_headて、admin 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
}

ありがとう、クリス!すべての有効なポイント。あなたが私に気付いた最大のことは、これを「コアハック」とは思っていませんでしたが(ファイルを変更するのではなく、追加しているため)、実際にはコアの他の機能に依存するためです。他のプラグイン(コア機能の変更後に死ぬ可能性があります)とそれほど違いはありませんが、間違いなく哲学的に異なります。考えてくれてありがとう!
MathSmath

Re:「3番目:...心配することはありません。」、wp-adminディレクトリをロックダウンする場合、たとえば.htaccessルールを使用して既知の安全なIP範囲に制限する場合はどうでしょうか。ajax-admin.phpファイルに対して何らかの例外を作成する必要があると思いますか?(.htaccessルールに関しては私がしびれであり、これが可能かどうか本当にわからないので、「推定」と言います。)
13

はい、単一のファイルを許可することが可能です。
chrisguitarguy

@chrisguitarguyこれは素晴らしい答えです、ありがとう。サイトURLをステージング/ホームURLにリバースプロキシしているため、フロントエンドにadmin-ajaxをロードしようとしています。これを見てください:リンクサードパーティのプラグインでそれを行うことは可能ですか?私のアプローチは間違っていますか?
パランザ

5

WordPressの多くのものと同様に、猫の皮を剥ぐ方法はほぼ無限にあります。受け入れられているすべてのメソッドは機能しますが、wp_localize_scriptを使用するよりも「ニート」ではないことがわかりました。は機能しますが、をしてフロントエンドにajax機能を含める。

これをチェックしてください:

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含めるのは非常に一般的です。これにより、より多くの人を引き付けることができ、他の開発者との連携が向上します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.