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.

Had a situation today where I was using admin-ajax.php from a front end script. As I understand it this the wp way to make ajax calls (registering my function with the wp_ajax_nopriv_myfunction hook)

Seems to me that since admin-ajax.php is on the admin side is_admin() returns true whereas my script calls it from the front end side.

This causes an issue with a plugin I use that does things differently on front and admin side of things.

So I was wondering if I was doing something wrong

is there a way to use ajax in front end the wp way and have is_admin() to return false ?

hope I could make myself understand

share|improve this question

2 Answers 2

WordPress sets is_admin() to true for all ajax requests (front-end or admin-side). (See codex).

There's isn't away of over-riding this (and you shouldn't anyway). If your ajax request can be fired from both front-end and admin side, then you may want to include whether it 'is admin' or not when you post the data. But without any details on the 'issues' it causes with your plug-in, it's hard to offer a work-aroudn.

share|improve this answer

I know this is old, but in case it helps anybody else that stumbles across this...

what I usually do is set some kind of flag in my frontend forms to denote that the incoming request is ajax.

<input type="hidden" id="my_ajax_flag" name="my_ajax_flag" value="false" />

Initially this is set to "false", which i then toggle to "true" while beginning to process the ajax.

$('#my_ajax_flag').val('true'); // example using jQuery

then in the admin side of my code, i check for that parameter and then either include my ajax hooks or perform my regular non-ajax admin stuff. So for example:

if ( isset( $_REQUEST['my_ajax_flag'] ) && $_REQUEST['my_ajax_flag'] == 'true' ) {
    add_action('wp_ajax_my_ajax_function', 'my_ajax_function');     
    add_action('wp_ajax_no_priv_my_ajax_function', 'my_ajax_function');
} else {
    // regular non-ajax stuff
}

depending on what you need to do, there are multiple variations of this idea, but it allows you to keep your regular admin code from interfering or firing while performing ajax requests.

another recommendation that can be handy is setting the WordPress "noheader" attribute in your forms.

<input type="hidden" name="noheader" value="true" />

when doing backend processing that ultimately results in a redirect (recommended for avoiding the dreaded double form submission), in rare fringe cases where you need to access wp hooks that would normally occur after "headers already sent".

share|improve this answer
    
Not needed: Just check defined( 'DOING_AJAX' ) && DOING_AJAX. –  toscho Mar 24 '13 at 22:19

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.