使用AJAX筛选器时获取当前分类ID的问题
问题原因及解决方案
问题根源
AJAX请求是发送到admin-ajax.php的独立HTTP请求,和原分类页面的主查询上下文完全无关,所以get_queried_object()在AJAX回调函数里无法获取到当前分类对象——这个函数仅在当前页面的主查询生效时才能拿到数据。
解决步骤
- 前端传递当前分类ID:在分类页面的筛选表单中添加隐藏字段,把当前分类ID传递给AJAX请求;
- 后端接收并验证参数:在AJAX回调里获取前端传来的分类ID,做安全校验后用于构建查询;
- 添加安全验证:通过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
相关产品推荐
相关产品推荐

