确定它是来自前端还是来自后端的AJAX调用

时间:2011-10-09 作者:Aurimas

我正在开发一个只支持管理员的插件,它在接口中使用了一些ajax调用。该网站本身也依赖其前端的ajax调用。

我希望能够识别由于“简单后端调用”、“AJAX后端调用”或“AJAX前端调用”而在何时加载WP。以最简单的形式,用例可以是只在管理页面上加载我的插件,或者从管理页面调用ajax。此外,它有助于在现场开发时不破坏前端:)

到目前为止,我发现了以下几点:

  • is_admin() 在所有AJAX调用上返回true(这很奇怪,imho)
  • 由于所有AJAX调用都是通过jQuery完成的,所以我可以通过HTTP变量确定AJAX调用HTTP_X_REQUESTED_WITH (见here).
3 个回复
最合适的回答,由SO网友:Saif Bechan 整理而成

我理解你的问题,我也在想同样的事情。

这不是一个真正的问题,这更多的是一个良好的编程设计问题,前端和后端有一个良好的分离。

现在,我解决这个问题的方法是:

我希望您将您的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\' )
);
这只是在frontpage中添加的,我相信您知道这是如何工作的。正如您所知,这将添加一小段javascript。请注意此处的变量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还是新手,所以也许这不是一个好方法,我希望这里的一些专业人士能对此发表评论。

SO网友:Rarst

is_admin() 在所有AJAX调用上返回true(这很奇怪,imho)

这并不奇怪,因为Ajax调用更多地遵循管理加载逻辑,而不是前端。实际上,Ajax负载是管理负载的专用版本。

以最简单的形式,用例可以是只在管理页面上加载我的插件,或者从管理页面调用ajax。

不知道你在这里是什么意思。脚本排队不依赖于Ajax。如果您不想在前端加载脚本,请不要在那里加载它。

现代WordPress不依赖于引用器等来检测呼叫的来源nonces 应用于源代码和意图验证。

因为这是您自己的代码,所以区别请求的最简单的方法是让请求带有明确的参数,并且信息是从前面还是后面。

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();
}
nonce数据应该与每个ajax调用一起使用,以根据http://codex.wordpress.org/AJAX_in_Plugins .

结束

相关推荐

WordPress AJAX没有像我预期的那样工作。怎么了?

在函数中。php我有:function testajax() { echo \"test\"; exit; } add_action(\'wp_ajax_testthisajax\', \'testajax\'); add_action(\'wp_ajax_nopriv_testthisajax\', \'testajax\'); 在脚本中。js我有:$(\"#thisformsid\").submit( function() {