如何解决WordPress functions.php中dk_get_case函数仅slug1页面生效问题
核心问题根因
- 变量使用错误:你的代码中用
$terms_1接收get_the_terms返回值,后续却调用了未定义的$terms[0],直接触发PHP错误导致函数失效。 - 全局变量未声明:
dk_get_case函数内没有声明global $post,$post变量本身为空,get_the_terms无法获取到任何分类数据。 - AJAX上下文缺失:
dk_get_case是WordPress AJAX接口的回调函数,AJAX请求和你当前打开的分类页面是完全独立的两个请求,AJAX请求不会继承分类页面的查询上下文,所以无论怎么在函数内尝试获取当前分类,都不可能拿到对应值。
修复方案
步骤1:分类模板传递当前分类slug到前端
在taxonomy-case_category.php和taxonomy-case_category-slug1.php模板中,先获取当前分类的slug,传递给前端用于AJAX请求携带:
// 分类模板顶部获取当前分类信息 $current_case_category = get_queried_object(); $current_slug = $current_case_category->slug;
将slug存入前端DOM节点的自定义属性,示例如下:
<div class="col case-right" data-current-slug="<?php echo esc_attr($current_slug); ?>"> <!-- dk_get_case()返回数据的展示位置 --> <div class="case-img" data-slider-3></div> <div class="popup"></div> </div>
步骤2:修改AJAX请求逻辑,携带分类slug参数
在触发get_caseAJAX请求的JS代码中,读取存储的slug,作为请求参数传递:
// 示例:读取自定义属性中的slug const currentSlug = document.querySelector('.case-right').dataset.currentSlug; // 发起AJAX请求时携带参数 fetch(wpAjax.ajaxurl, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams({ action: 'get_case', category_slug: currentSlug }) }) .then(res => res.json()) .then(res => { // 处理返回的业务逻辑 })
步骤3:修改dk_get_case函数,接收传递的分类slug
替换原有错误的获取分类slug的代码,从AJAX请求参数中读取并做合法性校验:
add_action('wp_ajax_get_case', 'dk_get_case'); add_action('wp_ajax_nopriv_get_case', 'dk_get_case'); function dk_get_case() { $headers['Access-Control-Allow-Origin'] = '*'; $return = ['status' => false, 'data' => [], 'message' => '']; // 读取AJAX传递的分类slug,加校验 $term_1 = isset($_POST['category_slug']) ? sanitize_text_field($_POST['category_slug']) : ''; if (empty($term_1) || !term_exists($term_1, 'case_category')) { $return['message'] = '分类参数非法'; echo json_encode($return); die; } $case_clinics = [19,20,24,32,22,12,29,44,14,47]; foreach($case_clinics as $key => $case_clinic){ $dk_posts = get_posts( array( 'showposts' => -1, 'post_type' => 'case', 'tax_query' => array( 'relation' => 'AND', array( 'taxonomy' => 'case_clinic', 'field' => 'term_id', 'terms' => $case_clinic ), array( 'taxonomy' => 'case_category', 'field' => 'slug', 'terms' => $term_1, ) ) ) ); // 原有后续处理逻辑保持不变 if(count($dk_posts) > 0){ foreach($dk_posts as $dk_post){ $attachment_id = CFS()->get('case_image', $dk_post->ID); $case_name1 = CFS()->get('case_name1', $dk_post->ID); $case_clinic = CFS()->get('case_clinic', $dk_post->ID); $case_name = CFS()->get('case_name', $dk_post->ID); $case_price = CFS()->get('case_price', $dk_post->ID); $case_risk = CFS()->get('case_risk', $dk_post->ID); $return['data'][$key][] = [ 'id' => $dk_post->ID, 'case_clinic'=>$case_clinic, 'thumb' => wp_get_attachment_image($attachment_id, 'case_clinic'), 'popup' => wp_get_attachment_image($attachment_id, 'full'), 'case_name1'=>$case_name1, 'case_clinic'=>$case_clinic, 'case_name'=>$case_name, 'case_price'=>$case_price, 'case_risk'=>$case_risk, ]; } }else{ $return['data'][$key][] = []; } } $return['status'] = true; echo json_encode($return); die; }
内容的提问来源于stack exchange,提问作者go_live
相关产品推荐
相关产品推荐

