I'm currently trying to unset a session variable in WordPress if the page get's reloaded. I've tried a lot but it's not working like I want it. This is my function:
/**
* Unset filter session if page get's reloaded
*/
add_action( 'wp', 'unset_filter_session' );
function unset_filter_session() {
//Reset sessions on refresh page
unset( $_SESSION['expenditure_filter'] );
}
It's working but it's working too good. Because when I reload the content-area
in WordPress via AJAX, the session get's unset too which should be avoided:
jQuery('#content-area').load(location.href + ' #content-area>*', '');
So how can I do the unset of the session just on page load and exclude AJAX reloads?
I'm currently trying to unset a session variable in WordPress if the page get's reloaded. I've tried a lot but it's not working like I want it. This is my function:
/**
* Unset filter session if page get's reloaded
*/
add_action( 'wp', 'unset_filter_session' );
function unset_filter_session() {
//Reset sessions on refresh page
unset( $_SESSION['expenditure_filter'] );
}
It's working but it's working too good. Because when I reload the content-area
in WordPress via AJAX, the session get's unset too which should be avoided:
jQuery('#content-area').load(location.href + ' #content-area>*', '');
So how can I do the unset of the session just on page load and exclude AJAX reloads?
Try using wp_doing_ajax()
like so:
function unset_filter_session() {
if ( ! wp_doing_ajax() ) {
//Reset sessions on refresh page
unset( $_SESSION['expenditure_filter'] );
}
}
You can check the answer's revision for this update part..
Sorry, I didn't realize that you're loading a page fragment (#content-area
) using the jQuery.load()
method. Or that you're not using the admin-ajax.php
to handle the AJAX request.
So if you're not using the wp_ajax_{action}
or wp_ajax_nopriv_{action}
action, or with the way you do the AJAX request, you can check whether the X-Requested-With
header is set and that its value is XMLHttpRequest
, and if so, you can cancel the session unsetting, like so:
function unset_filter_session() {
if ( empty( $_SERVER['HTTP_X_REQUESTED_WITH'] ) ||
'XMLHttpRequest' !== $_SERVER['HTTP_X_REQUESTED_WITH'] ) {
//Reset sessions on refresh page, if not doing AJAX request
unset( $_SESSION['expenditure_filter'] );
}
}
That should work because jQuery always sets that header, unless you explicitly remove it — or change its value.
See the headers
option on the jQuery.ajax()
reference:
The header
X-Requested-With: XMLHttpRequest
is always added, but its defaultXMLHttpRequest
value can be changed
Note: The header name is X-Requested-With
, but in the superglobal $_SERVER
, its key is HTTP_X_REQUESTED_WITH
. I.e. Don't use $_SERVER['X-Requested-With']
.
As suggested by Lawrence Johnson, you (ahem, we) should use filter_input()
:
function unset_filter_session() {
if ( 'XMLHttpRequest' !== filter_input( INPUT_SERVER, 'HTTP_X_REQUESTED_WITH' ) ) {
//Reset sessions on refresh page, if not doing AJAX request
unset( $_SESSION['expenditure_filter'] );
}
}
(but I kept the previous code for reference)
One thing you could consider doing is adding a header variable to your AJAX requests. Even a GET
or POST
param would likely to the trick. Perhaps something like this:
/**
* Unset filter session if page get's reloaded
*/
add_action( 'wp', 'unset_filter_session' );
function unset_filter_session() {
//Reset sessions on refresh page
if (!filter_input(INPUT_POST, 'isContentLoader', FILTER_SANITIZE_NUMBER_INT)) {
unset( $_SESSION['expenditure_filter'] );
}
}
And then
jQuery('#content-area').load(location.href + ' #content-area>*', { isContentLoader: 1 });