基于ACF插件实现两种药品数据对比的可行性及技术方案问询
用ACF实现药品对比功能的完整方案
当然可以用ACF实现这个药品对比需求!我帮你梳理完整的实现思路,顺便排查下你之前SQL查询的问题👇
一、核心结论
ACF本身就是为自定义字段存储设计的,你已经用它存储了药品名称、供应商等信息,完全可以通过ACF的官方API(或者配合WordPress原生查询)轻松实现对比功能,不用硬写复杂的原生SQL(当然我也会帮你优化之前的查询语句)。
二、具体实现步骤
1. 前端交互(jQuery + HTML)
先做两个输入框+对比按钮,通过AJAX请求后端数据,最后渲染成相邻的对比表格。这里我加了基础的参数校验,你可以根据需求加自动补全(比如用select2插件)提升用户体验。
示例HTML结构:
<div class="drug-compare-wrapper"> <div class="input-group"> <label>药品1:</label> <input type="text" id="drug-input-1" placeholder="请输入药品名称"> </div> <div class="input-group"> <label>药品2:</label> <input type="text" id="drug-input-2" placeholder="请输入药品名称"> </div> <button id="trigger-compare">开始对比</button> <div id="compare-result-area" class="result-container"></div> </div>
jQuery AJAX逻辑:
jQuery(document).ready(function($) { $('#trigger-compare').click(function() { const drug1 = $('#drug-input-1').val().trim(); const drug2 = $('#drug-input-2').val().trim(); if (!drug1 || !drug2) { alert('请输入完整的两个药品名称'); return; } $.ajax({ url: '/wp-admin/admin-ajax.php', // WordPress默认AJAX入口 method: 'POST', data: { action: 'fetch_drug_compare_data', // 后端钩子标识 drug_name_1: drug1, drug_name_2: drug2 }, success: function(res) { if (res.success) { $('#compare-result-area').html(res.data.html); } else { $('#compare-result-area').html(`<p class="error">${res.data.msg}</p>`); } }, error: function() { $('#compare-result-area').html('<p class="error">请求失败,请稍后重试</p>'); } }); }); });
2. 后端逻辑(PHP + ACF/WordPress API)
在主题的functions.php里添加AJAX处理函数,用WP_Query配合ACF的get_field()获取数据,比直接写SQL更安全,还能避免WordPress数据库结构变化带来的问题。
// 注册AJAX钩子(登录/未登录用户都能访问) add_action('wp_ajax_fetch_drug_compare_data', 'handle_drug_compare'); add_action('wp_ajax_nopriv_fetch_drug_compare_data', 'handle_drug_compare'); function handle_drug_compare() { // 参数校验 if (!isset($_POST['drug_name_1']) || !isset($_POST['drug_name_2'])) { wp_send_json_error(['msg' => '参数缺失']); } $drug1_name = sanitize_text_field($_POST['drug_name_1']); $drug2_name = sanitize_text_field($_POST['drug_name_2']); // 封装查询药品的通用逻辑 $get_drug_query = function($name) { return new WP_Query([ 'post_type' => 'post', // 这里改成你的药品自定义文章类型(如果不是post的话) 'post_status' => 'publish', 'meta_query' => [ [ 'key' => 'dd_name', // 你的ACF药品名字段key 'value' => $name, 'compare' => '=' ] ], 'posts_per_page' => 1 ]); }; $drug1_query = $get_drug_query($drug1_name); $drug2_query = $get_drug_query($drug2_name); // 检查查询结果 if (!$drug1_query->have_posts() && !$drug2_query->have_posts()) { wp_send_json_error(['msg' => '两个药品都未找到']); } elseif (!$drug1_query->have_posts()) { wp_send_json_error(['msg' => '药品1未找到']); } elseif (!$drug2_query->have_posts()) { wp_send_json_error(['msg' => '药品2未找到']); } // 获取药品的ACF字段数据 $drug1 = $drug1_query->posts[0]; $drug2 = $drug2_query->posts[0]; $drug1_data = [ '通用名称' => get_field('dd_name', $drug1->ID), '商品名称' => get_field('dd_commercial_name', $drug1->ID), '供应商' => get_field('dd_agent', $drug1->ID), '剂量规格' => get_field('dd_dosage', $drug1->ID), '副作用' => get_field('dd_side_effects', $drug1->ID) ]; $drug2_data = [ '通用名称' => get_field('dd_name', $drug2->ID), '商品名称' => get_field('dd_commercial_name', $drug2->ID), '供应商' => get_field('dd_agent', $drug2->ID), '剂量规格' => get_field('dd_dosage', $drug2->ID), '副作用' => get_field('dd_side_effects', $drug2->ID) ]; // 构建对比表格HTML $html = '<div class="drug-compare-tables">'; // 第一个药品表格 $html .= '<table class="drug-table">'; $html .= `<thead><tr><th colspan="2">${drug1_data['通用名称']}</th></tr></thead>`; $html .= '<tbody>'; foreach ($drug1_data as $label => $value) { $html .= `<tr><td>${label}</td><td>${$value ?? '暂无数据'}</td></tr>`; } $html .= '</tbody></table>'; // 第二个药品表格 $html .= '<table class="drug-table">'; $html .= `<thead><tr><th colspan="2">${drug2_data['通用名称']}</th></tr></thead>`; $html .= '<tbody>'; foreach ($drug2_data as $label => $value) { $html .= `<tr><td>${label}</td><td>${$value ?? '暂无数据'}</td></tr>`; } $html .= '</tbody></table>'; $html .= '</div>'; wp_send_json_success(['html' => $html]); // 重置查询 wp_reset_postdata(); }
三、关于你之前的SQL查询问题
你的SQL没奏效大概率是这两个原因:
- 引号格式错误:你用了
"(HTML实体),直接在phpMyAdmin执行要换成普通单/双引号; - 结果重复:LEFT JOIN会让每个meta字段对应一条记录,导致同一个药品返回多行数据,需要合并字段。
如果非要用SQL查询,优化后的语句如下:
SELECT p.id AS post_id, p.post_title, MAX(CASE WHEN pm.meta_key = 'dd_agent' THEN pm.meta_value END) AS supplier, MAX(CASE WHEN pm.meta_key = 'dd_name' THEN pm.meta_value END) AS drug_name, MAX(CASE WHEN pm.meta_key = 'dd_commercial_name' THEN pm.meta_value END) AS commercial_name FROM wp_posts p INNER JOIN wp_postmeta pm ON p.id = pm.post_id WHERE p.post_type = 'post' AND p.post_status = 'publish' AND pm.meta_key IN ('dd_agent', 'dd_name', 'dd_commercial_name') GROUP BY p.id, p.post_title;
这个语句会把同一个药品的多个字段合并到一行结果里,方便后续处理。
内容的提问来源于stack exchange,提问作者justcoder
相关产品推荐
相关产品推荐

