如何在WordPress中处理表单并将其数据生成XML文件
在WordPress中实现自定义表单生成XML文件的方案
一、修正表单代码
WordPress中无需单独指定PHP文件路径,表单可提交到当前页面,同时补充安全验证和必要属性:
<form action="<?php echo esc_url($_SERVER['REQUEST_URI']); ?>" method="post" enctype="multipart/form-data"> <input type="hidden" name="action" value="XMLBanf"> <?php wp_nonce_field('xml_banf_nonce', 'banf_nonce'); ?> <!-- 安全验证令牌 --> <label for="name">Name:</label> <input type="text" name="name" required> <label for="departement">Abteilung</label> <select name="departement"> <!-- 统一name属性与后续处理代码 --> <option value="keine_angabe">Keine Angabe</option> <option value="vertrieb">Vertrieb</option> <option value="it">IT</option> <option value="service">Service</option> <option value="lager">Lager</option> </select> <label for="order">Was soll bestellt werden: </label> <textarea name="order" cols="30" rows="10" required></textarea> <label for="reason_order">Grund der Bestellung</label> <input type="text" name="reason_order" required> <label for="price">Angebotspreis</label> <input type="number" name="price" required> <label for="offer_file">Angebotsdatei</label> <input type="file" name="offer_file"> <!-- 添加name属性以支持文件上传 --> <input type="submit" name="submit_button" value="Abschicken"> </form>
二、添加表单处理逻辑(主题functions.php)
将数据处理代码放到当前主题的functions.php文件中,利用WordPress的AJAX钩子完成请求处理:
// 绑定表单处理钩子(登录/未登录用户均支持) add_action('wp_ajax_XMLBanf', 'handle_xml_banf_submission'); add_action('wp_ajax_nopriv_XMLBanf', 'handle_xml_banf_submission'); function handle_xml_banf_submission() { // 安全验证:检查令牌有效性 if (!isset($_POST['banf_nonce']) || !wp_verify_nonce($_POST['banf_nonce'], 'xml_banf_nonce')) { wp_die('Ungültiges Sicherheits-Token.'); } // 检查表单提交触发条件 if (!isset($_POST['submit_button'])) { wp_die('Formular wurde nicht korrekt übermittelt.'); } // 清洗用户输入,避免恶意数据 $name = sanitize_text_field($_POST['name']); $departement = sanitize_text_field($_POST['departement']); $order = sanitize_textarea_field($_POST['order']); $reason_order = sanitize_text_field($_POST['reason_order']); $price = sanitize_text_field($_POST['price']); // 创建XML结构 $xml = new SimpleXMLElement('<?xml version="1.0" encoding="utf-8" ?><order></order>'); $xml->addChild('name', $name); $xml->addChild('departement', $departement); $xml->addChild('order', $order); $xml->addChild('reason_order', $reason_order); $xml->addChild('price', $price); // 处理文件上传(可选) if (!empty($_FILES['offer_file']['tmp_name'])) { $upload = wp_handle_upload($_FILES['offer_file'], array('test_form' => false)); if (!isset($upload['error']) || $upload['error'] === 0) { $xml->addChild('offer_file_url', $upload['url']); $xml->addChild('offer_file_path', $upload['file']); } } // 获取WordPress上传目录(安全存储文件) $upload_dir = wp_upload_dir(); $upload_path = $upload_dir['path'] . '/'; $file_name = md5(uniqid(mt_rand(), true)) . 'banf.xml'; $full_path = $upload_path . $file_name; // 保存XML文件并反馈结果 if ($xml->asXML($full_path)) { $xml_url = $upload_dir['url'] . '/' . $file_name; echo '<div style="padding:20px;background:#d4edda;color:#155724;">'; echo 'Formular erfolgreich übermittelt! XML-Datei: <a href="' . esc_url($xml_url) . '" target="_blank">Hier anzeigen</a>'; echo '</div>'; } else { echo '<div style="padding:20px;background:#f8d7da;color:#721c24;">'; echo 'Fehler beim Speichern der XML-Datei.'; echo '</div>'; } wp_die(); // 必须调用,终止AJAX请求 }
三、生成的XML文件访问方式
- 存储路径:XML文件默认保存在WordPress上传目录,格式为
wp-content/uploads/[年份]/[月份]/xxxxbanf.xml - 访问URL:直接使用网站域名拼接上传目录URL,例如
https://你的域名/wp-content/uploads/2024/05/xxxxbanf.xml - 快捷访问:表单提交成功后,页面会显示生成的XML文件链接,点击即可直接打开
注意事项
- 确保WordPress上传目录具备写入权限(通常为755或775)
- 若无需支持未登录用户提交,可删除
wp_ajax_nopriv_XMLBanf钩子 - 可根据需求添加文件类型限制,避免上传恶意文件
内容的提问来源于stack exchange,提问作者Blaemo
相关产品推荐
相关产品推荐

