web-dev-qa-db-ja.com

Ajaxを含むフロントエンドの条件付きチェック

コンテキストがフロントエンドビューではない場合に終了する条件付き条件が必要です AJAXリクエストを含みます。 現時点で私はこれを持っています:

if (is_admin() && !DOING_AJAX) 
    return;

is_admin()はajaxリクエストに対してtrueを返すのでDOING_AJAXビットが必要です。しかし、私はDOING_AJAXがバックエンドのものを含むすべてのajaxリクエストに対してtrueになると思います。したがって、実際には何も追加されません。

どうすれば2つの条件を分岐できますか?フロントエンド/バックエンドのAjaxリクエストは区別できますか?

ありがとうございます。

明確化

洞察をありがとう、しかし明確にするために、この例では、フック自体はajaxアクションではありません。これはget_the_termsへのフィルタフックで、フロントエンドのリクエストで動作する必要があります任意のテーマやプラグインのAjaxコードを含みます。それはまたバックエンドのために処理を迂回する必要があり、それゆえ分岐条件の必要性があります。問題は、ajaxリクエストがis_admin()に対して常にtrueを返すことです。

あなたが興味を持っているならば、それはまだそれらの分類学ページが存在することを可能にしながらフロントエンドの「秘密の」か「隠された」タグを隠すプラグインです。明らかな理由で「隠れる」ことはバックエンドで迂回される必要があります。

助けてくれてありがとう。最初の混乱ですみません。

3

DOING_AJAXWP_ADMIN(この定数はis_admin()内でチェックされます)はadmin-ajax.phpで定義され、trueに設定されます。どちらもこの状況ではあまり役に立ちません。

フロントエンドからのリクエストの場合は、ajaxリクエストにパラメータを追加します。

<?php

function my_action_javascript() {

?>
<script type="text/javascript" >
jQuery(document).ready(function($) {

    var data = {
        action: 'my_action',
        frontend_request: true,
        whatever: 1234
    };

    // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php
    $.post(ajaxurl, data, function(response) {
        alert('Got this from the server: ' + response);
    });
});
</script>
<?php
}

Ajaxコールバックで、パラメータが存在するかどうかを確認してtrueに設定できます。

$from_frontend = isset( $_REQUEST['frontend_request'] ) && ( TRUE === (bool) $_REQUEST['frontend_request'] );
$doing_ajax = defined( 'DOING_AJAX' ) && TRUE === DOING_AJAX;
$is_frontend_request = $frontend && $doing_ajax; 

if( TRUE === $is_frontend_request ){
    // yes, this request came from the front-end
    echo 'On frontend';
} else {
    // no, we are somewhere else
    echo 'Somewhere else';
}
1
Ralf912

フロントエンドと管理者のAjaxリクエストに別々のアクションを使用するだけです。

要求がフロントエンドからのものかadminからのものかに関係なく、

  • wp_ajax_{action}は、ユーザーがログインしたときにトリガされます
  • wp_ajax_nopriv_{action}は、ユーザーがいないときにトリガーされます。

あなたがリクエストがフロントエンドから来たのか、それとも管理者から来たのかを識別したいのであれば - 私は別のアクションを使うことを勧めます。これは@ Ralf912のアプローチと似ています - 異なる変数を送信するのではなく、フロントエンド要求と管理要求に対して異なる動作をするだけです。

あなたは自分自身をnonceを使って「騙される」ことから守ることもできます(しかしセキュリティが問題であるなら - あなたが要求が管理者スクリーンからであるときだけあなたはwp_ajax_{action}を使うべきです)。

1
Stephen Harris

おそらくあなたはAJAX hookを使っています

add_action('wp_ajax_{your_hook}', 'your_function');

your_functionに追加することができます:

function your_function() {

  define('FRONT_AJAX',true);

}

だからあなたはこのようにあなたの必要なチェックを追加することができます:

if (is_admin() && defined('FRONT_AJAX')) 
return;
1
gagn

皆さん、とても親密です!しかし、wp_ajax _ **フックは、通常その定数FRONT_AJAXを必要とするよりも遅く発火します。だから、私の解決策は私のニーズに関してはうまく機能します。

functions.phpで:

add_action( 'init', 'ib_define_front_ajax', 1 );
function ib_define_front_ajax(){
    if (isset($_REQUEST['FRONT_AJAX']) && $_REQUEST['FRONT_AJAX']=='true')
        define('FRONT_AJAX',true);
}

それから、あなたが除外する必要があるとき:

if ( !is_admin() || defined('FRONT_AJAX'))

または単に確認するには(gagnの回答によると):

if (is_admin() && defined('FRONT_AJAX')) 
return;
0
DocSS

スティーブンハリスによって共有された考えはいいです、しかし私の考えはとても単純です。

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