You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AJAX筛选器时获取当前分类ID的问题

问题原因及解决方案

问题根源

AJAX请求是发送到admin-ajax.php的独立HTTP请求,和原分类页面的主查询上下文完全无关,所以get_queried_object()在AJAX回调函数里无法获取到当前分类对象——这个函数仅在当前页面的主查询生效时才能拿到数据。

解决步骤

  1. 前端传递当前分类ID:在分类页面的筛选表单中添加隐藏字段,把当前分类ID传递给AJAX请求;
  2. 后端接收并验证参数:在AJAX回调里获取前端传来的分类ID,做安全校验后用于构建查询;
  3. 添加安全验证:通过nonce防止恶意请求,同时对接收的参数做 sanitize 处理。

修改后的代码示例

前端(分类页面的筛选表单及JS)

<form id="case-filter-form">
    <!-- 标签选择器 -->
    <select name="tag-select">
        <!-- 这里填充你的标签选项 -->
    </select>
    <!-- 隐藏字段传递当前分类ID -->
    <input type="hidden" name="current_cat_id" value="<?php echo get_queried_object_id(); ?>">
    <!-- Nonce安全验证字段 -->
    <?php wp_nonce_field('filter_cases_nonce', 'nonce'); ?>
    <button type="submit">筛选案例</button>
</form>

<script>
jQuery(document).ready(function($) {
    $('#case-filter-form').on('submit', function(e) {
        e.preventDefault();
        var formData = $(this).serialize();

        $.ajax({
            url: '<?php echo admin_url('admin-ajax.php'); ?>',
            type: 'POST',
            data: formData + '&action=filter_cases',
            success: function(response) {
                // 将返回的案例列表渲染到页面容器
                $('.case-studies-container').html(response.data);
            },
            error: function(xhr) {
                console.log(xhr.responseJSON.message);
            }
        });
    });
});
</script>

后端(AJAX回调函数)

add_action('wp_ajax_filter_cases','filter_function_blog');
add_action('wp_ajax_nopriv_filter_cases','filter_function_blog');

function filter_function_blog() {
    // 验证Nonce,确保请求合法
    check_ajax_referer('filter_cases_nonce', 'nonce');

    // 获取并清洗参数
    $current_cat_id = isset($_POST['current_cat_id']) ? absint($_POST['current_cat_id']) : 0;
    $selected_tag_id = isset($_POST['tag-select']) ? absint($_POST['tag-select']) : 0;

    // 参数校验
    if (!$current_cat_id || !$selected_tag_id) {
        wp_send_json_error('缺少必要的筛选参数');
        wp_die();
    }

    // 构建查询参数
    $post_args = array(
        'post_type' => 'case-studies',
        'posts_per_page' => 999,
        'tax_query' => array(
            'relation' => 'AND',
            array(
                'taxonomy' => 'category',
                'field' => 'id',
                'terms' => $current_cat_id
            ),
            array(
                'taxonomy' => 'post_tag',
                'field' => 'id',
                'terms' => $selected_tag_id
            )
        )
    );

    $query = new WP_Query($post_args);

    // 渲染案例列表
    if ($query->have_posts()) {
        ob_start();
        while ($query->have_posts()) {
            $query->the_post();
            // 这里替换成你的案例列表模板代码
            echo '<div class="case-item">';
            the_title('<h3 class="case-title">', '</h3>');
            the_excerpt();
            echo '</div>';
        }
        wp_reset_postdata();
        $content = ob_get_clean();
        wp_send_json_success($content);
    } else {
        wp_send_json_error('没有找到匹配的案例');
    }

    wp_die();
}

内容的提问来源于stack exchange,提问作者MattHamer5

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:01:17