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

基于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没奏效大概率是这两个原因:

  1. 引号格式错误:你用了&quot;(HTML实体),直接在phpMyAdmin执行要换成普通单/双引号;
  2. 结果重复: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 08:57:54