5

My aim is to update a WordPress post using AJAX. My code so far:

Script:

$.ajax({
    type: 'POST',
    url: ajax_url,
    data: {
        'action': 'wp_post',
        'ID': post_id,
        'post_title': post_title
},
success: function( data ) {
        $( '.message' )
        .addClass( 'success' )
        .html( data );
},
error: function() {
        $( '.message' )
        .addClass( 'error' )
        .html( data );
    }       
});

PHP:

function wp_post() {

    $post['ID'] = $_POST['ID'];
    $post['post_title'] = $_POST['post_title'];
    $post['post_status'] = 'publish';

    $id = wp_update_post( $post, true );

    if ( $id == 0 ) {
        $error = 'true';
        $response = 'This failed';
        echo $response;
    } else {
        $error = 'false';
        $response = 'This was successful';
        echo $response;
    }

}

As you can see the $response variable in my PHP function is being passed to the success function in my script and the value of $response is displayed on the page.

I want to modify my success function to do something like this:

success: function( data ) {
    if( $error == 'true' ) {
        // do something
    } else {
        // do something else
    }
},

The problem is, I am having trouble passing both the $response and $error variables in my PHP function to the success function in my scipt.

  1. Can anyone let me know how to pass $response and $error to my script's success function?
  2. Is there a better approach I should be taking?

I'm newish to AJAX so forgive me if the question is very basic.

4
  • why don't you use standard http result code instead of reinventing a protocol on top of a protocol? Commented Jan 7, 2014 at 15:50
  • Thanks njzk2 - as I said I'm newish to AJAX. Any chance you could provide an example of how to do that? Commented Jan 7, 2014 at 15:51
  • 1
    Encode the response as JSON object. Check out json_encode in PHP and JSON.parse in JavaScript. Commented Jan 7, 2014 at 15:52
  • 1
    use php.net/manual/en/function.http-response-code.php to set a failure code, which will get you into the ajax error function. Commented Jan 7, 2014 at 15:57

6 Answers 6

13

You shoud encode the response of the php script as json, as follows:

function wp_post() {

    $post['ID'] = $_POST['ID'];
    $post['post_title'] = $_POST['post_title'];
    $post['post_status'] = 'publish';

    $id = wp_update_post( $post, true );

    $response = array();

    if ( $id == 0 ) {
        $response['status'] = 'error';
        $response['message'] = 'This failed';
    } else {
        $response['status'] = 'success';
        $response['message'] = 'This was successful';
    }

    echo json_encode($response);

}

And then, in your javascript code:

success: function( data ) {
    if( data.status == 'error' ) {
        // error handling, show data.message or what you want.
    } else {
        // same as above but with success
    }
},
Sign up to request clarification or add additional context in comments.

3 Comments

Thanks taxicala - Do I need to add a data type to my $.ajax()?
It's better if you do :) Glad I could help you!
If you don't add a datatype, jquery will not know if it's json. You can also do this at the top of your php script with header('content-type: text/json');
2

You can create a JSON array like this one, in the backend:

$arr = array('error' => true, 'something' => 'foo');
echo json_encode($arr);

And then parse the json array to fetch the returned values, like this:

success: function( data ) {
    var error = '';
    var something = '';
    for(var i = 0; i < data.length ; i++)
    {
        error = data[i].error;
        something = data[i].something;
    }
    if( error ) {
        // do something
    } else {
        // do something else
    }
},

Wherea you echoed the array from the backend to the frontend, you can't simply access PHP variables within the JavaScript.

Note that there might be a syntax error, since I'm not testing it.

6 Comments

If you are passing a single string back in your php, it is absolutely unnecessary to go through the whole json process as long as your javascript ajax function asks for data returned in html.
pathfinder - I'm trying to pass 2 strings though. $response and $error
he only needs the one though, it's good or it's bad. why bloat code? But you guys can have the points. I will go back to making money on my compact code now. I really hate what stack overflow has become. It's like a video game now.
pathfinder - No I need 2. I need 'it's good or bad' AND 'the message'
You can send as many variables over as you want, what is the problem, henry?
|
1

What you are looking for is json_encode()

This converts a PHP array to JSON.

For example:

$dataArray = array( 'message' => 'Error', 'data' => data);
echo json_encode($dataArray);   

4 Comments

yours does not even answer his question. why bother critiquing. It makes stackoverflow a total annoyance in my life.
the question is: "I want to modify my success function to do something like this:"
Stack over flow is not about giving 100% working code, even though it's nice when possible, and this is what OP is looking for, it's no biggy if he has to do some research on what has been tipped to him.
you and phil are telling him to do unnecessary steps.
1

if you use:

echo json_encode($response);

on your .php function, remember to use:

var data = $.parseJSON(data);

on your ajax success.

Example:

function php_ajax_function() {

    // whatever you want to do...

    $response = array();

    if ( $id == 0 ) {
        $response['status'] = 'error';
        $response['message'] = 'This failed';
    } else {
        $response['status'] = 'success';
        $response['message'] = 'This was successful';
    }

    echo json_encode($response);
}

And then, in your javascript code:

success: function( data ) {

    console.log(data);

    var data = $.parseJSON(data);

    if( data.status == 'error' ) {
        // do something
    } else {
        // do other thing
    }
}

Comments

0

You cannot directly use PHP variables within JavaScript. The best you can do is manipulate PHP output in your JavaScript code.

For example, you could print $response as either 'error' or 'no_error' - and in your AJAX callback, check that var data does not equal 'error' (For example).

Comments

-2

the javascript variable data contains your echoed $response variable. So using your example, it would be something like this. Be sure you are also asking for html as your return data in the ajax function. here is the docs on that: http://api.jquery.com/jquery.ajax/

success: function( data ) {
    if( data == 'This failed' ) {
        // do something
    } else {
        // do something else
    }
},

4 Comments

works great for me, I use this method all the time. Then since I have it in html, I don't have to monkey with json or anything, I just pass a single statement from php and it works great.
Hi pathfinder - thanks for your help with this. I'll keep your approach in mind for when I need just one variable. Nice and simple.
data is an object, not a string.
the data is a string if you want it to be. If you look at original php he was passing one simple string. My function works and you all click without thinking. Yours works too, but it bloats the code. By saying this answer is incorrect you limit possibilities in an effort to be right.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.