表单提交上的PHP标头重定向不起作用

时间:2015-07-21 11:54:47

标签: php ajax

我想让脚本在点击提交按钮时使用PHP标头功能进行重定向。但是,它似乎不起作用。知道如何让它与PHP头函数一起工作吗?

这是我认为相关的功能的一部分: -

switch ( $service ) {
    case 'mailchimp' :
        $lastname = sanitize_text_field( $_POST['et_lastname'] );
        $email = array( 'email' => $email );

        if ( ! class_exists( 'MailChimp' ) )
            require_once( get_template_directory() . '/includes/subscription/mailchimp/mailchimp.php' );

        $mailchimp_api_key = et_get_option( 'divi_mailchimp_api_key' );

        if ( '' === $mailchimp_api_key ) die( json_encode( array( 'error' => __( 'Configuration error: api key is not defined', 'Divi' ) ) ) );


            $mailchimp = new MailChimp( $mailchimp_api_key );

            $merge_vars = array(
                'FNAME' => $firstname,
                'LNAME' => $lastname,
            );

            $retval =  $mailchimp->call('lists/subscribe', array(
                'id'         => $list_id,
                'email'      => $email,
                'merge_vars' => $merge_vars,
            ));

            if ( isset($retval['error']) ) {
                if ( '214' == $retval['code'] ){
                    $error_message = str_replace( 'Click here to update your profile.', '', $retval['error'] );
                    $result = json_encode( array( 'success' => $error_message ) );
                } else {
                    $result = json_encode( array( 'success' => $retval['error'] ) );
                }
            } else {
                $result = json_encode( array( 'success' => $success_message ) );
            }

        die( $result );
        break;

我尝试将$result替换为header("Location: http://www.example.com/");,但它无效。

1 个答案:

答案 0 :(得分:0)

您不能将代码更改为$result = header('Location: ...')的原因实际上非常简单。以此javascript调用为例:

$.post('/myscript.php', { et_lastname: 'Doe', email: 'j.doe@example.com' }, function(data) {
    // do something
});

会发生什么:

  1. 通过AJAX向/myscript.php
  2. 发出HTTP-POST呼叫
  3. 您的代码已执行,订阅了指定的电子邮件地址。
  4. PHP代码返回301
  5. AJAX调用将遵循重定向,但您的浏览器将保持在同一页面上。
  6. 您真正想要的是,当AJAX调用成功时,浏览器会重定向到另一个页面。为此,您需要更新PHP和Javascript。

    在PHP中,您必须返回浏览器重定向到的位置,例如:

    <?php
        $result = json_encode(array('location' => 'https://example.com/path/to/page'));
    

    现在,PHP脚本只返回带有位置键的json响应。除非我们告诉它,否则浏览器和javascript都不对该信息做任何事情:

    $.post('/myscript.php', { et_lastname: 'Doe', email: 'j.doe@example.com' }, null, 'json').done(function(data) {
        // do something ...
        // redirect browser to page we provided in the ajax response
        window.location = data.location;
    }).fail(function(data) {
        // handle the error
    });