コンテキストがフロントエンドビューではない場合に終了する条件付き条件が必要です 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を返すことです。
あなたが興味を持っているならば、それはまだそれらの分類学ページが存在することを可能にしながらフロントエンドの「秘密の」か「隠された」タグを隠すプラグインです。明らかな理由で「隠れる」ことはバックエンドで迂回される必要があります。
助けてくれてありがとう。最初の混乱ですみません。
DOING_AJAX
とWP_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';
}
フロントエンドと管理者のAjaxリクエストに別々のアクションを使用するだけです。
要求がフロントエンドからのものかadminからのものかに関係なく、
wp_ajax_{action}
は、ユーザーがログインしたときにトリガされますwp_ajax_nopriv_{action}
は、ユーザーがいないときにトリガーされます。あなたがリクエストがフロントエンドから来たのか、それとも管理者から来たのかを識別したいのであれば - 私は別のアクションを使うことを勧めます。これは@ Ralf912のアプローチと似ています - 異なる変数を送信するのではなく、フロントエンド要求と管理要求に対して異なる動作をするだけです。
あなたは自分自身をnonceを使って「騙される」ことから守ることもできます(しかしセキュリティが問題であるなら - あなたが要求が管理者スクリーンからであるときだけあなたはwp_ajax_{action}
を使うべきです)。
おそらくあなたは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;
皆さん、とても親密です!しかし、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;
スティーブンハリスによって共有された考えはいいです、しかし私の考えはとても単純です。
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呼び出しごとに存在する必要があります。