admin管理员组

文章数量:1419656

I'm trying to send a variable to the server, using XMLHttpRequest.

I tested it on local on a non-Wordpress file and it works. But on production, on my Wordpress file, the onreadystatechange AJAX status doesn't get to 200.

Is there anything I need to be aware when XMLHttpRequesting in Wordpress?

I have the following code for sending data to the server using XMLHTTP Request but it's not working I don't know why? I'm getting the following error:

VM704:1 POST http://localhost/amt/wp-admin/admin-ajax.php 400 (Bad Request)

here is my WordPress code:

add_action('wp_ajax_csv_file', 'csv_file');

add_action('wp_ajax_nopriv_csv_file', 'csv_file');

function csv_file()
{
if($_POST['rtype'] == 'enr_data'){
        set_time_limit(0);
        ob_implicit_flush(true);
        ob_end_flush();

        for ($i = 0; $i < 10; $i++) {
            //Hard work!!
            sleep(1);
            $p = ($i + 1) * 10; //Progress
            $response = array('message' => $p . '% plete. server time: ' . date("h:i:s", time()),
                'progress' => $p);

            echo json_encode($response);
        }

        sleep(1);
        $response = array('message' => 'Complete',
            'progress' => 100);

        echo json_encode($response);

        die();
        }
}

function ajax_stream() {
            if (!window.XMLHttpRequest) {
                alert("Your browser does not support the native XMLHttpRequest object.");
                return;
            }
            try {
                var xhr = new XMLHttpRequest();
                xhr.previous_text = '';
                xhr.responseType = "text";

                xhr.onerror = function() {
                    alert("[XHR] Fatal Error.");
                };
                xhr.onreadystatechange = function() {
                    try {
                        if (xhr.readyState == 4) {
                            alert('[XHR] Done')
                        } else if (xhr.readyState > 2) {
                            var new_response = xhr.responseText.substring(xhr.previous_text.length);
                            var result = JSON.parse(new_response);

                            document.getElementById("divProgress").innerHTML += result.message + '<br />';
                            document.getElementById('progressor').style.width = result.progress + "%";

                            xhr.previous_text = xhr.responseText;
                        }
                    } catch (e) {
                        alert("[XHR STATECHANGE] Exception: " + e);
                    }
                };
                var data = "action=csv_file&rtype=enr_data";
                xhr.open("POST", ajaxurl, true);
                xhr.send(data);
                console.log(xhr);
            } catch (e) {
                alert("[XHR REQUEST] Exception: " + e);
            }
        }
#divProgress {
            border: 2px solid #ddd;
            padding: 10px;
            width: 300px;
            height: 265px;
            margin-top: 10px;
            overflow: auto;
            background: #f5f5f5;
        }
        
        #progress_wrapper {
            border: 2px solid #ddd;
            width: 321px;
            height: 20px;
            overflow: auto;
            background: #f5f5f5;
            margin-top: 10px;
        }
        
        #progressor {
            background: #07c;
            width: 0%;
            height: 100%;
            -webkit-transition: all 1s linear;
            -moz-transition: all 1s linear;
            -o-transition: all 1s linear;
            transition: all 1s linear;
        }
        
        .demo_container {
            width: 680px;
            margin: 0 auto;
            padding: 30px;
            background: #FFF;
            margin-top: 50px;
        }
        
        .my-btn,
        .my-btn2 {
            width: 297px;
            margin-top: 22px;
            float: none;
            display: block;
        }
        
        h1 {
            font-size: 22px;
            margin-bottom: 20px;
        }
        
        .float_left {
            float: left;
        }
        
        .float_right {
            float: right;
        }
        
        .demo_container::after {
            content: "";
            clear: both;
            display: block;
        }
        
        .ghost-btn.active {
            border: 2px solid #D23725;
            color: #D23725;
        }
        
        .ghost-btn {
            display: inline-block;
            text-decoration: none;
            border: 2px solid #3b8dbd;
            line-height: 15px;
            color: #3b8dbd;
            -webkit-border-radius: 3px;
            -webkit-background-clip: padding-box;
            -moz-border-radius: 3px;
            -moz-background-clip: padding;
            border-radius: 3px;
            background-clip: padding-box;
            font-size: 15px;
            padding: .6em 1.5em;
            -webkit-transition: all 0.2s ease-out;
            -moz-transition: all 0.2s ease-out;
            -o-transition: all 0.2s ease-out;
            transition: all 0.2s ease-out;
            background: #ffffff;
            -webkit-box-sizing: content-box;
            -moz-box-sizing: content-box;
            box-sizing: content-box;
            cursor: pointer;
            zoom: 1;
            -webkit-backface-visibility: hidden;
            position: relative;
            margin-right: 10px;
        }
        
        .ghost-btn:hover {
            -webkit-transition: 0.2s ease;
            -moz-transition: 0.2s ease;
            -o-transition: 0.2s ease;
            transition: 0.2s ease;
            background-color: #3b8dbd;
            color: #ffffff;
        }
        
        .ghost-btn:focus {
            outline: none;
        }
        
        .ghost-btn.active {
            border: 2px solid #D23725;
            color: #D23725;
        }
        
        .ghost-btn.active:hover {
            border: 2px solid #D23725;
            background: #FFF;
        }
        
        .method_wrappers {
            margin-bottom: 20px;
        }
<div class="demo_container">
        <div class='method_wrappers'>
            <a class='ghost-btn active' href='#'>XHR Method</a>
            <a class='ghost-btn' href='../example2/index.html'>Iframe Method</a>
        </div>
        <h1>AJAX progress bar for PHP script without polling (XHR method)</h1>
        <div class='float_left'>
            <h3>Progress Bar</h3>
            <div id='progress_wrapper'>
                <div id="progressor"></div>
            </div>
            <a onclick="ajax_stream();" class='my-btn'>Start Ajax Streaming</a>
        </div>
        <div class='float_right'>
            <h3>Log</h3>
            <div id="divProgress"></div>
        </div>
    </div>

I'm trying to send a variable to the server, using XMLHttpRequest.

I tested it on local on a non-Wordpress file and it works. But on production, on my Wordpress file, the onreadystatechange AJAX status doesn't get to 200.

Is there anything I need to be aware when XMLHttpRequesting in Wordpress?

I have the following code for sending data to the server using XMLHTTP Request but it's not working I don't know why? I'm getting the following error:

VM704:1 POST http://localhost/amt/wp-admin/admin-ajax.php 400 (Bad Request)

here is my WordPress code:

add_action('wp_ajax_csv_file', 'csv_file');

add_action('wp_ajax_nopriv_csv_file', 'csv_file');

function csv_file()
{
if($_POST['rtype'] == 'enr_data'){
        set_time_limit(0);
        ob_implicit_flush(true);
        ob_end_flush();

        for ($i = 0; $i < 10; $i++) {
            //Hard work!!
            sleep(1);
            $p = ($i + 1) * 10; //Progress
            $response = array('message' => $p . '% plete. server time: ' . date("h:i:s", time()),
                'progress' => $p);

            echo json_encode($response);
        }

        sleep(1);
        $response = array('message' => 'Complete',
            'progress' => 100);

        echo json_encode($response);

        die();
        }
}

function ajax_stream() {
            if (!window.XMLHttpRequest) {
                alert("Your browser does not support the native XMLHttpRequest object.");
                return;
            }
            try {
                var xhr = new XMLHttpRequest();
                xhr.previous_text = '';
                xhr.responseType = "text";

                xhr.onerror = function() {
                    alert("[XHR] Fatal Error.");
                };
                xhr.onreadystatechange = function() {
                    try {
                        if (xhr.readyState == 4) {
                            alert('[XHR] Done')
                        } else if (xhr.readyState > 2) {
                            var new_response = xhr.responseText.substring(xhr.previous_text.length);
                            var result = JSON.parse(new_response);

                            document.getElementById("divProgress").innerHTML += result.message + '<br />';
                            document.getElementById('progressor').style.width = result.progress + "%";

                            xhr.previous_text = xhr.responseText;
                        }
                    } catch (e) {
                        alert("[XHR STATECHANGE] Exception: " + e);
                    }
                };
                var data = "action=csv_file&rtype=enr_data";
                xhr.open("POST", ajaxurl, true);
                xhr.send(data);
                console.log(xhr);
            } catch (e) {
                alert("[XHR REQUEST] Exception: " + e);
            }
        }
#divProgress {
            border: 2px solid #ddd;
            padding: 10px;
            width: 300px;
            height: 265px;
            margin-top: 10px;
            overflow: auto;
            background: #f5f5f5;
        }
        
        #progress_wrapper {
            border: 2px solid #ddd;
            width: 321px;
            height: 20px;
            overflow: auto;
            background: #f5f5f5;
            margin-top: 10px;
        }
        
        #progressor {
            background: #07c;
            width: 0%;
            height: 100%;
            -webkit-transition: all 1s linear;
            -moz-transition: all 1s linear;
            -o-transition: all 1s linear;
            transition: all 1s linear;
        }
        
        .demo_container {
            width: 680px;
            margin: 0 auto;
            padding: 30px;
            background: #FFF;
            margin-top: 50px;
        }
        
        .my-btn,
        .my-btn2 {
            width: 297px;
            margin-top: 22px;
            float: none;
            display: block;
        }
        
        h1 {
            font-size: 22px;
            margin-bottom: 20px;
        }
        
        .float_left {
            float: left;
        }
        
        .float_right {
            float: right;
        }
        
        .demo_container::after {
            content: "";
            clear: both;
            display: block;
        }
        
        .ghost-btn.active {
            border: 2px solid #D23725;
            color: #D23725;
        }
        
        .ghost-btn {
            display: inline-block;
            text-decoration: none;
            border: 2px solid #3b8dbd;
            line-height: 15px;
            color: #3b8dbd;
            -webkit-border-radius: 3px;
            -webkit-background-clip: padding-box;
            -moz-border-radius: 3px;
            -moz-background-clip: padding;
            border-radius: 3px;
            background-clip: padding-box;
            font-size: 15px;
            padding: .6em 1.5em;
            -webkit-transition: all 0.2s ease-out;
            -moz-transition: all 0.2s ease-out;
            -o-transition: all 0.2s ease-out;
            transition: all 0.2s ease-out;
            background: #ffffff;
            -webkit-box-sizing: content-box;
            -moz-box-sizing: content-box;
            box-sizing: content-box;
            cursor: pointer;
            zoom: 1;
            -webkit-backface-visibility: hidden;
            position: relative;
            margin-right: 10px;
        }
        
        .ghost-btn:hover {
            -webkit-transition: 0.2s ease;
            -moz-transition: 0.2s ease;
            -o-transition: 0.2s ease;
            transition: 0.2s ease;
            background-color: #3b8dbd;
            color: #ffffff;
        }
        
        .ghost-btn:focus {
            outline: none;
        }
        
        .ghost-btn.active {
            border: 2px solid #D23725;
            color: #D23725;
        }
        
        .ghost-btn.active:hover {
            border: 2px solid #D23725;
            background: #FFF;
        }
        
        .method_wrappers {
            margin-bottom: 20px;
        }
<div class="demo_container">
        <div class='method_wrappers'>
            <a class='ghost-btn active' href='#'>XHR Method</a>
            <a class='ghost-btn' href='../example2/index.html'>Iframe Method</a>
        </div>
        <h1>AJAX progress bar for PHP script without polling (XHR method)</h1>
        <div class='float_left'>
            <h3>Progress Bar</h3>
            <div id='progress_wrapper'>
                <div id="progressor"></div>
            </div>
            <a onclick="ajax_stream();" class='my-btn'>Start Ajax Streaming</a>
        </div>
        <div class='float_right'>
            <h3>Log</h3>
            <div id="divProgress"></div>
        </div>
    </div>

Share Improve this question edited Nov 13, 2018 at 10:15 Khalil DaNish asked Nov 12, 2018 at 10:46 Khalil DaNishKhalil DaNish 5576 silver badges20 bronze badges 5
  • 1 Did you declare the ajaxurl var properly?? I don't see it declared in your code – Rafsun Chowdhury Commented Nov 12, 2018 at 10:59
  • Did you try to run it after clearing your cache? – Naser Nikzad Commented Nov 12, 2018 at 10:59
  • @Rafsun Chowdhury, Yes it's correct did you see the Error text added above. that's the url: localhost/amt/wp-admin/admin-ajax.php – Khalil DaNish Commented Nov 12, 2018 at 11:06
  • It's hard for me to understand the goal here. At the very least I can say you should be validating each request with a nonce within the PHP. – GFargo Commented Nov 17, 2018 at 3:15
  • @GFargo I just has 400 error this means the request is not sent to the server side. – Khalil DaNish Commented Nov 17, 2018 at 4:58
Add a ment  | 

2 Answers 2

Reset to default 4

When using an XHR instead of a jQuery/AJAX request, I found it's actually easier and more reliable to append the action to the ajaxurl.

var xhr = new XMLHttpRequest();
var url = ajaxurl + '?action=csv_file';

xhr.open( 'POST', url, true );

The method of passing data to the request varies a bit, but 95% of the time I use a simple object to query string function:

// Convert an Object into a Query String
function objectToQueryString(obj){
    return Object.keys(obj).map(key => key + '=' + obj[key]).join('&');
}

Which in practice will turn a simple data object

var data = {
    'post_id': ajax_object.post_id,
    'rtype': 'enr_data',
    'field': element.getAttribute('data-field'),
};

into a simple query string:

post_id=1234&rtype=enr_data&field=bar

This lets me pass the data off as a string posted to the target function:

var dataString = objectToQueryString( data );
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send(dataString);

For larger or more plex tasks you can actually effectively wrap the whole thing in a Promise as well, which I'll do if for instance I need to upload a handful of files and pass those along one by one for resizing.

The right solution would be to use "encodeURIComponent". Which correctly transcodes all strings and characters. The function will be:

function encodeURI(obj) {
  var result = '';
  var splitter = '';
  if (typeof obj === 'object') {
    Object.keys(obj).forEach(function (key) {
      result += splitter + key + '=' + encodeURIComponent(obj[key]);
      splitter = '&';
    });
  }
  return result;
},

End then use it in your request:

var data = {
  action: 'your action',
  data: JSON.stringify(data)
};

let request = new XMLHttpRequest();
request.open('POST', '/wp-admin/admin-ajax.php', true);
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
request.send(encodeURI(data));

本文标签: javascriptXMLHttpRequest is not working in the WordPressStack Overflow