在页面重新加载/设置时取消设置会话变量,但不包括AJAX

时间:2018-12-05 作者:Johnny97

如果重新加载页面get,我当前正在尝试在WordPress中取消设置会话变量。我试了很多次,但都没有达到我想要的效果。这是我的职责:

/**
 * 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\'] );
}
这很有效,但效果太好了。因为当我重新加载content-area 在通过AJAX的WordPress中,会话get也未设置,应避免:

jQuery(\'#content-area\').load(location.href + \' #content-area>*\', \'\');
那么,如何在页面加载时取消会话设置并排除AJAX重新加载呢?

2 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

尝试使用wp_doing_ajax() 像这样:

function unset_filter_session() {
    if ( ! wp_doing_ajax() ) {
        //Reset sessions on refresh page
        unset( $_SESSION[\'expenditure_filter\'] );
    }
}
更新您可以检查此更新部分的答案版本

更新#2

抱歉,我没有意识到您正在加载页面片段(#content-area) 使用jQuery.load() 方法或者你没有使用admin-ajax.php 处理AJAX请求。

因此,如果您不使用wp_ajax_{action}wp_ajax_nopriv_{action} 操作,或者使用执行AJAX请求的方式,可以检查X-Requested-With 标题已设置,其值为XMLHttpRequest, 如果是这样,您可以取消会话取消设置,如下所示:

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\'] );
    }
}
这应该是可行的,因为jQuery总是设置该标头,除非您显式删除它—或更改其值。

请参见headers 上的选项jQuery.ajax() reference:

标题X-Requested-With: XMLHttpRequest 始终添加,但其默认值为XMLHttpRequest 值可以更改

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\'].

根据建议更新#3Lawrence Johnson, 你(嗯,我们)应该使用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\'] );
    }
}
(但我保留了之前的代码以供参考)

SO网友:Lawrence Johnson

您可以考虑做的一件事是在AJAX请求中添加一个头变量。即使是GETPOST 帕拉姆可能会耍花招。也许是这样的:

/**
 * 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\'] );
    }
}
然后

jQuery(\'#content-area\').load(location.href + \' #content-area>*\', { isContentLoader: 1 });

相关推荐

AJAX Implementation

我试图基于WordPress中的下拉列表,使用AJAX实现数据库中的数据。控制台中返回400个错误请求的代码。我作为本地主机托管了该页面。这是我的主题functions.php //我更改了密码 function my_enqueue_scripts() { wp_enqueue_script(\'jquery\'); } add_action(\'wp_enqueue_scripts\', \'my_enqueue_scripts\'); functio