我正在尝试为列表站点创建一个具有可复制部分的表单。它应该是这样工作的:
从一个列表表单开始,填写表单,单击“添加另一个”,会出现另一组重复的表单字段(通过jQuery)填写第二张表格,然后单击“添加另一张”填写第三张表格。然后单击“提交”每个字段集都将成为一个草稿帖子,稍后在成功签出WooCommerce后发布(我稍后会弄清楚)我正在用jQuery复制DOM元素,类似于this demo by Tristan Denyer.
我正在使用这个基本的概念验证测试代码来查看如何使用顺序ID或非顺序ID循环DOM元素。注意:我知道没有安全性或验证,只是尝试让这个循环工作
This is with a sequential ID:
<form action="" id="testForm" method="POST">
<input type="text" id="testField_1" name="testField_1">
<input type="text" id="testField_2" name="testField_2">
<button type="submit">Submit!</button>
</form>
<?php
$testArray = array( $_POST[\'testField_1\'], $_POST[\'testField_2\'] );
foreach( $testArray as $value ) {
$post_information = array(
\'post_title\' => $value,
\'post_status\'=>\'draft\',
\'post_type\' => \'apu\' );
wp_insert_post( $post_information );
}
Results: 它是有效的,创建了两个帖子,每个帖子都有一个在表单中完成的帖子标题,但是,如果我有10个重复的部分,每个部分都有自己的一组大约20个元字段,那么testArray将很快成为一个巨大的数组,只需伴随序列ID。我觉得foreach循环不需要序列ID,所以我只需要创建一组输入的数组,然后在每组之间循环。
Here\'s my attempt without sequenced IDs
<form action="" id="testForm" method="POST">
<input type="text" id="testField" name="testField">
<input type="text" id="testField" name="testField">
<button type="submit">Submit!</button>
</form>
<?php
$testArray = array( $_POST[\'testField\'] );
foreach( $testArray as $value ) {
$post_information = array(
\'post_title\' => $value,
\'post_status\'=>\'draft\',
\'post_type\' => \'apu\' );
wp_insert_post( $post_information );
}
Results: 这只会创建一篇帖子,帖子的标题始终是第二个字段的数据。未创建第一篇帖子。
如果没有一个充满各种可能的ID的数组,我如何创建每个字段集的帖子我需要从wp\\u insert\\u post返回的ID中合并add\\u post\\u meta。这是在foreach循环中完成的吗元字段(尚未添加)是否需要在自己的数组中(&L);对于原始foreach中的每个循环基本上。。我做错了什么?
最合适的回答,由SO网友:Aric Watson 整理而成
在第二个场景中,您将获得唯一的第二个标题,因为您需要为每个字段指定唯一的字段名,否则其中一个将覆盖$_POST
.
解决此问题的一种方法是使用一个名为maybe的隐藏字段max_id
其中存储了在表单上使用的最高id号,因此它从1开始,每次加载另一组表单字段时,jquery都会递增。
然后,您的php读取该字段,并执行基本的for循环,从1开始到max_id
已提交并从中读取表单数据$_POST
. 它看起来像这样:
$max = $_POST[\'max_id\'];
for ($i=1; $i <= $max; $i++) {
$field_key = \'testfield_\' . $i;
// process the form data here...
// you can add suffix to $field_key if you\'re working with more than just a title field
// i.e. $some_field = $_POST[$field_key . \'_some_field\']
// which would correspond to $_POST[\'testfield_1_some_field\'], $_POST[\'testfield_2_some_field\'], etc
}
Second scenario
如注释中所述,您需要允许使用非连续的表单字段ID。在这种情况下,我会使用不同的方法。设置一个隐藏字段并使用它存储表单字段ID(只需数字即可),并在添加/删除新字段集时通过jQuery适当地更新此字段。例如,当表单由PHP提交和处理时,您可能会得到如下结果:
<input type="hidden" name="field_ids" value="1,2,3,5,7" />
然后,您的PHP需要获取这个隐藏字段的值,并适当地循环遍历字段:
$field_ids = explode(\',\', $_POST[\'field_ids\']);
foreach ($field_ids as $id) {
$field_key = \'testfield_\' . $i;
// use the fieldkey to access values in $_POST as need be.
}