为什么要使用admin-ajax.php,它如何工作?


9

我对json数据的ajax调用可以正常运行,就像下面的functions.php一样:

add_action( 'wp_ajax_nopriv_load-filter', 'prefix_load_cat_posts' );
add_action( 'wp_ajax_load-filter', 'prefix_load_cat_posts' );
function prefix_load_cat_posts () {
  //get data here
}

javascript:

var ajaxurl = 'http://'+window.location.host+'/wp-admin/admin-ajax.php';
jQuery.ajax({
    type: 'POST',
    url: ajaxurl,
    etc.

我有两个问题。

1)为什么使用admin-ajax.php而不是将json编码在一个单独的文件中,themes/example/json.php然后在其中编码数据?

2)admin-ajax.php如何工作?我对那个文件不太了解。它会加载所有功能,以便您准备使用它们吗?

谢谢!


2
值得注意的是,任何答案都将讨论为什么themes/example/json.php应将其视为主要的安全漏洞
Tom J Nowell

Answers:


14

1)为什么要使用admin-ajax.php而不是像在一个单独的文件中那样编码json themes/example/json.php并在那里编码数据?

使用admin-ajax.php表示WordPress核心已加载并可用。否则,您将需要手动加载所需的文件,这是一个复杂的过程,如果您不太了解Core,则很容易出错。而且,您对Javascript安全性有多好?

2)如何admin-ajax.php工作?我对那个文件不太了解。它会加载所有功能,以便您准备使用它们吗?

  1. 它加载了WordPress Core,这意味着您可以使用$wpdb 和之类的东西$WP_Query。那是通过第25行。
  2. 它发送一些标题-第37-41行。
    1. 内容类型标题
    2. 标题,告诉浏览器不要缓存结果
    3. 有趣的标头是那些由 send_nosniff_headers()
    4. nocache_headers()
  3. admin_init钩火灾。
  4. 核心动作是动态定义和注册的(第46-73行),除非需要它们,否则不会注册这些核心操作,也就是说,除非通过$_GET或请求它们$_POST
  5. “心跳” API钩子触发-第75行
  6. 将检查发出请求的用户的“已登录”状态,并触发适当的管理或“无特权”挂钩。

我认为,第1项和第6项是使用AJAX API的主要原因。您拥有几乎肯定需要的WordPress Core,并且具有与其他WordPress相同的登录安全系统。


6

admin-ajax.php是WordPress AJAX API的一部分,是的,它确实处理来自后端和前端的请求。在这里我想出你的问题是:

2)admin-ajax.php如何工作?

对于逻辑,您可以在这里访问。

假设您已经知道如何使JavaScript入队,等等。

JavaScript片段:

jQuery(document).ready(function($) {

    // We'll pass this variable to the PHP function example_ajax_request
    var fruit = 'Banana';

    // This does the ajax request
    $.ajax({
        url: ajaxurl,
        data: {
            'action':'example_ajax_request',
            'fruit' : fruit
        },
        success:function(data) {
            // This outputs the result of the ajax request
            console.log(data);
        },
        error: function(errorThrown){
            console.log(errorThrown);
        }
    });   

});

PHP片段:

function example_ajax_request() {

    // The $_REQUEST contains all the data sent via ajax 
    if ( isset($_REQUEST) ) {

        $fruit = $_REQUEST['fruit'];

        // Let's take the data that was sent and do something with it
        if ( $fruit == 'Banana' ) {
            $fruit = 'Apple';
        }

        // Now we'll return it to the javascript function
        // Anything outputted will be returned in the response
        echo $fruit;

        // If you're debugging, it might be useful to see what was sent in the $_REQUEST
        // print_r($_REQUEST);

    }

    // Always die in functions echoing ajax content
   die();
}

add_action( 'wp_ajax_example_ajax_request', 'example_ajax_request' );

// If you wanted to also use the function for non-logged in users (in a theme for example)
 add_action( 'wp_ajax_nopriv_example_ajax_request', 'example_ajax_request' );

1)为什么要使用admin-ajax.php而不是在一个单独的文件(例如themes / example / json.php)中对json进行编码,然后在其中编码数据?

可能有帮助。admin-ajax.php与Ajax请求的自定义页面模板


嘿,您能解释一下这些动作挂钩'wp_ajax_example_ajax_request'和'wp_ajax_nopriv_example_ajax_request'我在任何地方都找不到解释。另外,ajaxurl可以解决什么问题?谢谢
David Okwii
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.