Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

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?

share|improve this question
    
@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 '10 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 '10 at 16:26

1 Answer 1

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);
});

Maybe this guide will help you. http://www.wphardcore.com/2010/5-tips-for-using-ajax-in-wordpress/

share|improve this answer
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 '10 at 12:43
    
by the way, where do you set the value of ajaxurl variable? –  user1567 Dec 1 '10 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 '10 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 '10 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 '10 at 15:23

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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