选中从前端或从控制面板触发的AJAX

时间:2014-09-23 作者:Miqdad Ali

我有ajax方法,用户可以从仪表板或前端触发相同的方法。我只想了解ajax的触发位置。有什么办法可以找到吗?

我试过了is_admin 方法,但它总是返回true

add_action( \'wp_ajax_get_something\', \'get_something\');
add_action( \'wp_ajax_nopriv_get_something\', \'get_something\');

function get_something(){
   $data = array(
       \'current_time\' => time(),
       \'is_admin\' => is_admin()
   );

   die(json_encode($data));
}
用于仪表板和前端的Javascript

     jQuery.ajax({
        url: admin_url+\'admin-ajax.php?action=get_something\',
        type: \'post\',
        success: function(response){
            //need to check whether request sent from dashboard or front-end
        }
    });

2 个回复
最合适的回答,由SO网友:cybmeta 整理而成

Wordpress中的Ajax请求总是在管理端执行,所以is_admin() 返回始终为true。如果需要知道ajax请求来自何处,则需要检查脚本的执行位置,而不是脚本发送ajax请求的位置。

例如:

add_action(\'wp_enqueue_scripts\', \'cyb_enqueue_scripts\');
function cyb_enqueue_scripts() {

    //Register the script.
    wp_register_script(\'my-script\', get_stylesheet_directory_uri(). \'/js/my-script.js\', array( \'jquery\' ) );

    //Enqueue the script and dependencies
    wp_enqueue_script(\'jquery\');
    wp_enqueue_script(\'my-script\');

    //Set up the vars data for the script
    $scriptvars = array(
                    \'ajaxurl\' => admin_url( \'admin-ajax.php\' ),
                    \'data\'    => array(
                                  \'action\'   => \'get_something\',
                                  \'is_admin\' => is_admin()
                             )
                   );
    wp_localize_script(\'my-script\', \'script_vars\', $scriptvars);
}


add_action( \'wp_ajax_get_something\', \'get_something\');
add_action( \'wp_ajax_nopriv_get_something\', \'get_something\');

function get_something(){

    if( isset($_POST[\'is_admin\']) && $_POST[\'is_admin\'] == true ) {
        //The ajax request comes from admin area
        $is_admin = true;
    } else {
        $is_admin = false;
    }

    $data = array( \'is_admin\' => $is_admin );
    wp_send_json_success( $data );

}
然后,js代码(本例中的my-script.js文件):

(function($){
    $(document).ready(function(){
        jQuery.ajax({
            url: script_vars.ajaxurl,
            data: script_vars.data,
            type: \'post\',
            success: function(response){
                alert(response.data.is_admin);
            }
         });
    });
})(jQuery);

SO网友:Mark Kaplun

对于IMO来说,让一个请求根据从a页还是从B页执行而表现不同是个坏主意。将AJAX视为一个正式的API,并这样对待它,从长远来看,您的生活会更轻松。

如果前端和后端需要两种不同的行为,那么只需使用两种不同的请求即可。

结束

相关推荐

具有多个类实例的WP_AJAX处理程序

八个月前,我问了几乎相同的问题there. 但到目前为止,这个问题仍然没有得到解决。但我还有一个想法,为什么它会失败。在此期间,我的代码得到了改进。我有多个具有相同结构的类:<?php class McCustomPost { ... } $wpMcCustomPost = new McCustomPost(); ?> ... <?php class McAdmin { ... } $wpMcAdmin = new McAdmin(