前端条件检查,包括AJAX

时间:2011-11-25 作者:Hari Honor

如果上下文不是包含AJAX请求的前端视图,我需要一个退出的条件 我现在有这个:

if (is_admin() && !DOING_AJAX) 
    return;
TheDOING_AJAX bit是必需的,因为is_admin() 退货true 用于ajax请求。但我相信DOING_AJAX 将是true 用于所有ajax请求,包括后端的请求。因此,它并没有在这里添加任何内容。

我怎样才能改变这两种情况?能否区分前端/后端ajax请求?

谢谢

澄清

感谢您的见解,但要澄清的是,在本例中,挂钩本身不是ajax操作。这是一个过滤器挂钩get_the_terms 它需要对任何前端请求进行操作,包括任意主题或插件ajax代码。它还需要绕过后端处理,因此需要分叉条件。问题是,对于is_admin()

如果你好奇的话,这是一个插件,它隐藏了;“机密”;或“或”;“隐藏”;标记,同时仍允许其分类页面存在。“The”;隐藏“;由于明显的原因,需要在后端绕过。

谢谢你的帮助。很抱歉最初的混淆!

5 个回复
SO网友:Ralf912

DOING_AJAXWP_ADMIN (该常数在is_admin() ) 在管理ajax中定义。php并将tro设置为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\';
}

SO网友:gagn

可能您正在使用AJAX挂钩

add_action(\'wp_ajax_{your_hook}\', \'your_function\');
在您的函数中,您可以添加:

function your_function() {

  define(\'FRONT_AJAX\',true);

}
因此,您可以像这样添加所需的支票:

if (is_admin() && defined(\'FRONT_AJAX\')) 
return;

SO网友:Stephen Harris

对前端和管理ajax请求使用单独的操作。

无论请求是来自前端还是管理员:

  • wp_ajax_{action} 当用户登录时触发wp_ajax_nopriv_{action} 当用户不在时触发

    您还可以通过使用nonce来保护自己不被“欺骗”(但如果安全性有问题,您应该只使用wp_ajax_{action} 当请求来自管理屏幕时)。

SO网友:Reza Mamun

斯蒂芬·哈里斯的想法很好,但我的想法很简单。

is_admin() returns always true whether it is from back or front ajax request.
只需为nonce字段定义两个不同的名称。(因此,除了开发商之外,没有人知道哪个名称用于哪个目的。)示例:

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();
}
根据http://codex.wordpress.org/AJAX_in_Plugins .

SO网友:DocSS

你们,伙计们,非常接近!但是wp\\u ajax\\u**挂钩的启动时间比我们通常需要的持续的FRONT\\u ajax要晚。因此,我的解决方案更好地满足了我的需求。

在函数中。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;

结束

相关推荐

插件中未显示ADMIN_NOTES

我知道我可能在做一些愚蠢的事情,但我就是不能让它运行。我正在尝试为我的插件设置一个小API,并创建一个类来更轻松地显示管理通知。以下是我所拥有的:// Send data to class to get HTML for admin notice $efpd=Efpdd::getInstance(); $plugin_update = $efpd->efpd_admin_notice( $notice_info = array( \'type\