如何在WordPress中处理表单并从其数据中创建XML文件?

jm81lzqq  于 12个月前  发布在  WordPress
关注(0)|答案(1)|浏览(145)

我有一个表单,我想用这个表单提交的数据创建一个XML文件,并将这个文件保存到一个特定的路径。
我不知道如何在WordPress中将数据传递到PHP文件。通常我会在action属性中传递PHP文件的路径并处理数据。
但是我如何在WordPress中做到这一点呢?我创建了没有插件的表单。
我是新的WordPress和仍然试图弄清楚的事情。
这是一种形式:

<form action="???" method="post">
        
        <input type="hidden" name="action" value="XMLBanf">
        
        <label for="name">Name:</label>
        <input type="text" name="name" required="">

        <label for="departement">Abteilung</label>
        <select name="Abteilung">
            <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"></label>
        <input type="file">

        <input type="submit" name="submit_button" value="Abschicken">
    </form>

字符串
然后我会尝试这样处理数据:

if(isset($_POST['submit'])){
    $xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\" ?><order></order>");

    $xml->addChild('name',$_POST['name']);
    $xml->addChild('departement',$_POST['departement']);
    $xml->addChild('order',$_POST['order']);
    $xml->addChild('reason_order',$_POST['reason_order']);
    $xml->addChild('price',$_POST['price']);

    $fileName = md5(uniqid(mt_rand(), true))."banf.xml";
    $asXML= $xml->asXML();
    $file = fopen($fileName, "w+");
    fwrite($file, $asXML);
    fclose($file);
    print_r(error_get_last());

    if(file_exists("./".$fileName)){
        $myXML = file_get_contents("./".$fileName);
        $xml = new SimpleXMLElement($myXML);
        $xmlpretty = $xml->asXML();

        // pretty print the XML in browser
        header('content-type: text/xml');
        echo $xmlpretty;
    }


我现在如何访问此文件?

yftpprvb

yftpprvb1#

您可以在functions.php文件或自定义插件中挂钩到init操作(https://developer.wordpress.org/reference/functions/add_action/)。

add_action( 'init', function() {
    if ( ! isset( $_POST['submit'] ) ) {
        return;
    }

    // Process submission here.
} );

字符串
您可以将表单操作的URL设置为home_url(),例如:action="<?php esc_url( home_url() ); ?>"。任何WordPress生成的页面都会触发您的init操作,运行您的代码。
有几件事需要注意:
1.“submit”太模糊,可能会与其他提交冲突,因此请确保为您的操作添加一个具有唯一且清晰名称的隐藏输入。
1.确保您对表单使用nonce来对抗CSRFs。虽然您可能认为您现在没有漏洞,但重要的是要习惯将nonce添加到所有表单中,作为安全最佳实践:https://developer.wordpress.org/apis/security/nonces/#adding-a-nonce-to-a-form
1.不要忘记exit;和短路您的输出,以防止WordPress从加载主页进一步。

相关问题