为什么我不能在AJAX回调之外访问“$_POST”数据?

时间:2016-03-19 作者:iszwnc

我正在尝试将一些数据从后端传递到JavaScript。问题是,当我试图console.log() 变量通过wp_localize_script() 它显示我在Console 我之前操作过的结构,但没有从表单中检索到的实际数据。

PHP代码

add_action( \'wp_ajax_origin\', \'create_an_ajax_request_origin_form\' );
add_action( \'wp_ajax_nopriv_origin\', \'create_an_ajax_request_origin_form\' );
function create_an_ajax_request_origin_form() {
    $fields = array(
        \'address\'     => wp_kses( sanitize_text_field( $_REQUEST[ \'origin\' ][ \'address\' ] ), array() ),
        \'number\'      => wp_kses( intval( absint( $_REQUEST[ \'origin\' ][ \'number\' ] ) ), array() ),
        \'address_two\' => wp_kses( sanitize_text_field( $_REQUEST[ \'origin\' ][ \'address_two\' ] ), array() ),
        \'city\'        => wp_kses( sanitize_text_field( $_REQUEST[ \'origin\' ][ \'city\' ] ), array() ),
    );

    $GLOBALS[ \'address_origin\' ] = str_replace( array( \'Rua.\', \'Rua\', \'R.\', \'R\', \'Ru\', \'Ru.\', \'Ra\', \'Ra.\' ), array( \'\', \'\', \'\', \'\', \'\', \'\', \'\', \'\' ), $fields[ \'address\' ] ) . \', \' . $fields[ \'number\' ] . \' - \' . $fields[ \'city\' ];
}

create_an_ajax_request_origin_form();
$GLOBALS[ \'address\' ] = $address_origin;
请注意,我正在创建一个全局变量,用于检索从AJAX Request.

add_action( \'wp_enqueue_scripts\', \'enqueuing_script_for_origin_form\' );
function enqueuing_script_for_origin_form() {
    wp_enqueue_script( \'origin_form\', get_template_directory_uri() . \'/js/sistema-de-entrega/origin-form.js\', array( \'jquery\' ), null, true );
    wp_localize_script( \'origin_form\', \'origin\', array(
        \'admin_ajax\' => admin_url( \'admin-ajax.php\' ),
        \'address\' => $GLOBALS[ \'address\' ]
    ) );
}
我想用这个$GLOBALS[ \'address_origin\' ] 超全局变量贯穿我的整个代码。

例如,假设我有一个函数调用validate_address() 接收来自的地址create_an_ajax_request_origin_form(). 如何访问address 函数中的变量?我的整个.php 密码

JavaScript代码

$.post( origin.admin_ajax, origin_data, function( response ) {
    console.log( origin.address, response );
} );
通过wp_localize_script() 我想和origin.address 我希望以这种方式嵌入JavaScript代码。

输出,0-

这就是我应该从Console.

我的地址,200-我的城市

在我看来,这似乎是乞丐的问题,但我真的很困惑,也无法让它正常工作:/

更多信息我忘了说如果我var_dump() 从内部create_an_ajax_request_origin_form() 我把地址处理得很好,空格都填好了。我想filter 后端中的数据然后通过wp_localize_script(), 并以JavaScript中我想要的方式使用它。

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

也许这是适合你的答案

因此,对于这个问题,更合理的答案是wp_send_json() 使用(如有必要)wp_send_json_success()wp_send_json_error() 功能。他们会将一个JSON对象返回到AJAX请求,它会自动die() 为了你。它看起来像这样:

add_action( \'wp_ajax_origin\', \'create_an_ajax_request_origin_form\' );
add_action( \'wp_ajax_nopriv_origin\', \'create_an_ajax_request_origin_form\' );
function create_an_ajax_request_origin_form() {
    $fields = array(
        \'address\'     => wp_kses( sanitize_text_field( $_POST[ \'origin\' ][ \'address\' ] ), array() ),
        \'number\'      => wp_kses( intval( absint( $_POST[ \'origin\' ][ \'number\' ] ) ), array() ),
        \'address_two\' => wp_kses( sanitize_text_field( $_POST[ \'origin\' ][ \'address_two\' ] ), array() ),
        \'city\'        => wp_kses( sanitize_text_field( $_POST[ \'origin\' ][ \'city\' ] ), array() ),
    );

    wp_send_json( $fields ); // there\'s no need to use die() function if you\'re using wp_send_json()
}
如果一切正常,现在您可能可以达到$fields 来自AJAX请求内部的数据,如下所示:

$.post( origin.admin_ajax, origin_data, function( response ) {
    console.log( response.city ); // this will print out the response sent by the Backend through the wp_send_json() function
} );
Obs: 我更改了超全局$_REQUEST 变量至$_POST, 在我看来,这是最合适的做法。因为我们使用的是$.post 方法在Frontend 以及Backend.

真实世界的答案,直到那时,我还不知道我需要将数据扩展到WordPress Dashboard. 因此,唯一的选择(在本例中)是通过create_an_ajax_request_origin_form() 功能并将其存储在超全局$_COOKIE 大堆

我宁愿利用JavaScript Cookie Repository 为了处理JavaScript中的Cookie,这种方式更清楚地说明了我实际使用Cookie的原因。