检测Pre_Get_Posts函数中的AJAX调用

时间:2021-12-08 作者:Mathieu Préaud

在前端,我有一个带有AJAX “加载更多”按钮。存档页的循环按以下顺序排序dateASC. 我在pre_get_posts 作用

内部pre_get_posts 我使用的函数defined(\'DOING_AJAX\') && DOING_AJAX 检测何时有AJAX调用并应用订单过滤器。

此外,如果是自定义post类型归档页面“workshop”,我想添加到条件语句中。不幸的是,它不起作用。

这个pre_get_posts 功能:

add_action(\'pre_get_posts\', \'ajax_filter_posts\');
add_filter(\'ajax_pre_get_posts\', \'ajax_filter_posts\');
function ajax_filter_posts($query) {
    if ( is_post_type_archive(\'workshop\') && defined(\'DOING_AJAX\') && DOING_AJAX ) {
            $query->set( \'orderby\', \'date\' );
            $query->set( \'order\', \'ASC\' );
      $query->set( \'suppress_filters\', true );
    }

    return $query;
}
AJAX加载更多按钮的代码:

function mysite_loadmore_ajax_handler_workshop(){
    $args = json_decode( stripslashes( $_POST[\'query\'] ), true );
    $args[\'paged\'] = $_POST[\'page\'] + 1;
    $args[\'post_type\'] = \'workshop\';
    $args[\'post_status\'] = \'publish\';
    $args[\'posts_per_page\'] = 10;

    $query_ajax = apply_filters(\'ajax_pre_get_posts\', (new WP_Query($args)));

    if ( $query_ajax->have_posts() ) : while ( $query_ajax->have_posts() ) : $query_ajax->the_post();

        get_template_part( \'template-parts/content\', \'archive-workshop\' );

    endwhile;

    endif;
    die;
}
add_action(\'wp_ajax_loadworkshop\', \'mysite_loadmore_ajax_handler_workshop\'); // wp_ajax_{action}
add_action(\'wp_ajax_nopriv_loadworkshop\', \'mysite_loadmore_ajax_handler_workshop\'); // wp_ajax_nopriv_{action}
任何帮助都将不胜感激,谢谢。

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

除非您传递归档页面上的信息,否则处理AJAX响应的请求将无法知道。

请记住,对服务器的每个新请求都是一张白板,从初始请求到AJAX请求,页面后面没有共享上下文,除非您明确创建它并通过cookie、POST参数、GET参数、user meta等自己传递它

相关推荐

我在通过AJAX调用wp-json端点时收到401

N.B. Resolved - I hadn\'t noticed it was a POST rather than a GET.我正在尝试使用来自前端页面的AJAX调用来提取列表;“员工”;(自定义帖子类型)。我可以通过wp-json/wp/v2/staff在浏览器中获取数据,但当我尝试通过AJAX获取数据时,我会得到401。我假设我需要以某种方式进行身份验证,但无法确定如何进行身份验证。提前谢谢。