7

I'm trying to integrate ajax in wordpress using the wp codex guidelines. In the PHP I added:

wp_enqueue_script ( 'my_ajax', ADMIN_URL . 'js/ajax.js','jquery','1.0.0' );
wp_localize_script( 'my_ajax', 'MyAjax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );

The ajax code is:

jQuery.ajax({url: MyAjax.ajaxurl, type: "POST",data: {action: 'myaction',postID : MyAjax.postID}, success: function(response) {
 alert('Got this from the server: ' + response);
}});

and the PHP function that should be called by ajax is:

function ajax_function() {
...do something...
}
add_action('wp_ajax_myaction', 'ajax_function');
add_action('wp_ajax_admin_myaction', 'ajax_function');

The ajax call is successful (the "alert" works), however, the php function "ajax_function" is never called. After doing some debugging I realized that even though the action call add_action('wp_ajax_ sets a new element in the global $wp_filter array, when the corresponding do_action runs inside admin-ajax.php, the $wp_filter array no longer contains that element.

Therefore, "ajax_function" function is ignored. Any idea why the function is not called?

2
  • @user1567: You add the function to the wp_ajax_myaction and wp_ajax_admin_myaction hooks. Should that not be wp_ajax_myaction (for logged in users) and wp_ajax_nopriv_myaction (for anonymous users)?
    – Jan Fabry
    Dec 1, 2010 at 13:52
  • yes I fixed it, thanks. By the way, I have an update_option call inside the "ajax_function" that seem to fail because it is called after all wordpress loading sequence is complete? Is there another way to update_option?
    – user1567
    Dec 1, 2010 at 16:26

2 Answers 2

8

In my projects I do it like that

PHP

function foo() {
    echo 'bar';
}
add_action('wp_ajax_foo', 'foo' ); // executed when logged in
add_action('wp_ajax_nopriv_foo', 'foo' ); // executed when logged out

Javascript

data = { action: 'foo', avalue: 'some value', 'anothervalue': 'another value' };
jQuery.post(ajaxurl, data, function(response){
    alert(response);
});
6
  • 1
    Thanks for the answer. I know this guide, I went over it as well. I changed the function to be exactly like yours but no luck :-( The function is still not called.
    – user1567
    Dec 1, 2010 at 12:43
  • by the way, where do you set the value of ajaxurl variable?
    – user1567
    Dec 1, 2010 at 12:46
  • 1
    In my example I assumed that variable is already set. In WP Backend the variable is always set. In the frontend I just define it in the header. <script type="text/javascript"> var ajaxurl = <?php bloginfo('url') ?>'/wp-admin/admin-ajax.php'; </script> I bet there is a smarter way to handle it.
    – Horttcore
    Dec 1, 2010 at 13:46
  • I see. anyway, the function still doesn't work for me. Does it matter that the ajax is for admin back end? or the same functions should be used?
    – user1567
    Dec 1, 2010 at 14:35
  • I finally fixed it. The problem was the loading order and the location of the add_action calls. I have another small question: you wrote data = { action: 'foo', avalue: 'some value', 'anothervalue': 'another value' }; What if I want to include an array as the value of one of the keys?
    – user1567
    Dec 1, 2010 at 15:23
2

Please follow the code:

add_action( 'wp_ajax_add_myfunc', 'prefix_ajax_add_myfunc' );
add_action( 'wp_ajax_nopriv_add_myfunc', 'prefix_ajax_add_myfunc' );

function prefix_ajax_add_myfunc() {
    // Handle request then generate response using WP_Ajax_Response
}

and in your ajax call do this:

jQuery.post(
    ajaxurl, 
    {
        'action': 'add_myfunc',
        'data':   'foobarid'
    }, 
    function(response){
        alert('The server responded: ' + response);
    }
);

in the ajax call you'll call your function without prefix_ajax_. Only call by it's remaining. In that case it's add_myfunc. In the response it will send done if everything goes right. Else response will be 0 or -1.

Hope it will help. Thank you.

Your Answer

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

Not the answer you're looking for? Browse other questions tagged or ask your own question.