web-dev-qa-db-ja.com

それがあるかどうかを判断 AJAX フロントエンドまたはバックエンドから呼び出す

私は管理者専用のプラグインを開発しています。これは、そのインターフェースでいくつかのajax呼び出しを使用します。 Webサイト自体もフロントエンドのajax呼び出しに依存しています。

"simple backend call"、 "AJAX backend call"、または "AJAX frontend call"のためにWPがいつロードされたかを識別できるようにしたいのですが。最も単純な形式のユースケースは、管理ページまたはそれらからのajax呼び出しにのみ私のプラグインをロードすることです。そのうえ、それはライブサイトで開発している間フロントエンドを壊さないことを助けます:)

これまでのところ、私は次のことがわかりました。

  • is_admin()はすべてのAJAX呼び出しでtrueを返します(これは奇妙です、imho)
  • 私のAJAX呼び出しはすべてjQueryを介して行われるので、HTTP変数HTTP_X_REQUESTED_WITHでAJAX呼び出しを決定できます(ここで を参照してください )。

しかし、管理側のAJAXとフロントサイドのAJAXを区別する方法を私はまだ理解できません。何か案は?

1
Aurimas

私はあなたが抱えている問題を理解しています、私は同じことを考えていました。

それは実際には問題ではありません、それはより良いプログラミングデザインの問題であり、フロントエンドとバックエンドをうまく分離しています。

今私がこれを解決するためにどうにかして方法は以下をすることです:

AJAXアクションをwp_localize_scriptで呼び出していることを願っています。このように実装することで、これを少しだけ拡張します。

wp_localize_script(
    'my-site-script',
    'my_ajax_object',
    array(
        'my_ajax_url' => admin_url( 'admin-ajax.php' ),
        'my_frontend_call' => 'something-here',
        'my_nonce' => wp_create_nonce( 'my_nonce' )
);

これはフロントページにのみ追加されています、私はあなたがこれがどのように機能するか知っていると確信しています。あなたが知っているように今これはジャバスクリプトの小さな部分を追加します。ここでは変数my_frontend_callに注意してください。これはこれから使用する重要なものです。

ここで適切なAjax呼び出しを設定する方法について詳しくは、 link を参照してください。

これですべてが設定できたので、バックエンドのロジックを簡単に実装できるようになりました。

<?php
// Here we check that we are facing the backend.
// This will also be true if we are facing the 
// frontend but making an AJAX call. 
// As you say bad, also IMO
if( is_admin() )
{
        //Now here we are going to put the magic
        if(isset($_POST['my_frontend_call'])){
            // Now these actions are loaded only when `my_frontend_call` is set
            // You can add everything here that only get's loaded on a call where
            // `my_frontend_call` is set
            add_action('wp_ajax_handle_frontend_ajax', 'handle_frontend_ajax_callback');
            add_action('wp_ajax_admin_only_ajax', 'admin_only_ajax_callback');
        }
}

これで、さまざまな場所からのさまざまな変数とこれを少し混同することができます。

これが既知の推奨事項ではない理由はわかりません。私の意見では、それが必要でさえないときに何かがロードされるのは醜いです。

NOTE私はまだWordPressに慣れていないので、これは良い方法ではないかもしれません。ここの専門家の一部がこれについてコメントできることを願っています。

1
Saif Bechan

is_admin()はすべてのAJAX呼び出しでtrueを返します(これは奇妙です、imho)

Ajax呼び出しはフロントエンドよりもはるかに多くの管理ロードロジックに従うため、これは奇妙なことではありません。基本的にAjaxの負荷は管理者向けの特別なバージョンです。

最も単純な形式のユースケースは、管理ページまたはそれらからのajax呼び出しにのみ私のプラグインをロードすることです。

あなたがここで何を意味するのかわからない。スクリプトキューイングはAjaxに依存しません。フロントエンドにスクリプトが欲しくないなら - そこにそれをロードしないでください。

現代のWordPressは呼び出し元からの検出にリファラーなどに頼らず、代わりに ノンス をソースとインテントの検証に使うべきです。

それはあなた自身のコードなのでリクエストを区別するための最も簡単な方法はリクエストが明示的な引数で情報を持っていることです。

1
Rarst
is_admin() returns always true whether it is from back or front ajax request.

私の考えはとても単純です。 nonceフィールドに2つの異なる名前を定義するだけです。 (つまり、開発者以外では、誰がどの目的のためにどの名前を知っているのでしょう。)例:

add_action('wp_ajax_{my_ajax_hook}', 'my_ajax_function');
function my_ajax_function() {

    if( isset($_REQUEST['f_nonce']) ){
        $fromFront = true;
        $nonceField = 'f_nonce';
    }else{
        //by default from backend or you can alter;
        $fromFront = false;
        $nonceField = 'b_nonce';
    }

    if ( ! wp_verify_nonce( $_REQUEST[$nonceField], 'my-nonce-pass' ) ) {
        die( 'Security check' ); 

    } else {
        // Do stuff here according to the value of $fromFront;

    }
    exit();
}

Nonceデータは、 http://codex.wordpress.org/AJAX_in_Plugins に従って、スクリプトを保護するためのajax呼び出しごとに存在する必要があります。

0
Reza Mamun