I need a conditional which exits if the context is not a front-end view including AJAX requests. I have this at the moment:
if (is_admin() && !DOING_AJAX)
return;
The DOING_AJAX
bit is required since is_admin()
returns true
for ajax requests. However I believe DOING_AJAX
will be true
for ALL ajax requests including those on the backend. Thus it doesn’t really add anything here.
How can I fork the two conditions? Can front-end/back-end ajax requests be distinguished?
thanks!
Clarification
Thanks for the insights but to clarify, in this instance, the hook itself is NOT an ajax action. It’s a filter hook into get_the_terms
which needs to operate on any front-end request including any arbitrary theme or plugin ajax code. It also needs to bypass processing for the back-end hence the need for the forking condition. The problem is that ajax requests always return true for is_admin()
In case you are curious it’s a plugin which hides “secret” or “hidden” tags on the front-end, while still allowing their taxonomy pages to exist. The “hiding” needs to be bypassed on the backend for obvious reasons.
Thanks for the help. Sorry for the initial confusion!
DOING_AJAX
andWP_ADMIN
(this constant is checked withinis_admin()
) are defined in admin-ajax.php and set tro true. Both are not very helpfull in this situation.Add a parameter to your ajax request if the request come from the front-end:
In your ajax callback you can now check if the parameter is present and set to true:
Probably you are using AJAX hook
in your_function you can add:
So you can add your needed check like this:
Simple use a separate actions for front-end and admin ajax requests.
Regardless of whether the request is from the front-end or admin:
wp_ajax_{action}
is triggered when the user is logged inwp_ajax_nopriv_{action}
is triggered when the user is not.So if you want to discern whether the request is from the front-end, or the admin – I recommend using different actions. This is similar to @Ralf912 approach – except rather than sending a separate variable just have different actions for front-end and admin-requests.
You can also protect yourself from being ‘duped’ by using nonces (but if security is an issue – you should only be using
wp_ajax_{action}
when the request is from an admin screen).The idea shared by Stephen Harris is nice, but my idea is very simple.
Just define two different names for the nonce field. (So, other than the developer, no one will know which name for which purpose.) Example:
* The nonce data should be with each ajax call to secure your script according to http://codex.wordpress.org/AJAX_in_Plugins .
You, guys, are very close! But wp_ajax_** hooks fire later than we usually need that constant FRONT_AJAX.
So, my solution works better as for my needs.
in functions.php:
Then, when you need to exclude:
Or to just check (as per gagn’s answer):