从自定义POST中动态分配的元变量中获取数据

时间:2019-03-06 作者:Debbie Kurth

我需要为数据输入类型功能动态分配元盒。每个元框表示一组与成员关联的数据,例如名称、地址、城市等。不确定我的操作是否有误。配置框确实显示正确,但在尝试读取数据时,它只返回最后分配的配置框的数据。

作为测试,我分配了两个具有唯一名称的元数据库,并尝试了各种方法将单个字段命名为输入。每个元数据库中都有相同的字段,唯一不同的是哪个元数据库。从输入的角度来看,每个元数据库将包含不同的实时数据,但类型相同。下面的代码返回到简单的测试代码。还是没有运气。真的需要一些帮助。

function add_manual_form() 
 {
  $args = array(\'Index\'=>\'1\');
  add_meta_box( \'List_Group1\',
           __( \'List Records\' ),
               \'TEST_card\',
               \'xxxlist\',
               \'normal\',
               \'high\',
               $args
             );

  $args = array(\'Index\'=>\'2\');              
  add_meta_box( \'List_Group2\',
            __( \'List Records\' ),
               \'TEST_card\',
               \'xxxlist\',
               \'normal\',
               \'high\',
               $args
            );
}
add_action( \'add_meta_boxes\', \'add_manual_form\' );
add_action( \'save_post\', \'save_TESTCARD\');

function TEST_card($post_ID, $Arg)
{
$Index = $Arg[\'args\'][\'Index\']; 
?>
 <select name="field1" id="field1" class="postbox">
     <option value="">Select something...</option>
     <option value="something">Something</option>
     <option value="else">Else</option>
 </select>
<input type="hidden" id="index" name="index" value=<?php echo $Index; ?>>

 <?php
 }


function save_TESTCARD($post_ID) 
{
if (array_key_exists(\'field1\', $_POST)) 
   {
   $InputValue = $_POST[\'field1\'];
   $Index = $_POST[\'index\'];
   DebugLog($InputValue);
   DebugLog((string)$Index);
   }
}
调试输出日志显示以下内容:

2019年3月6日,06:20:33:其他

2019年3月6日,06:20:33:2

第二个元框的值。第一个元盒的值永远不会出现。

可以利用任何人的洞察力。

1 个回复
SO网友:Debbie Kurth

找到了一个解决方案,尽管你必须稍微改变一下你的前提。

确实无法添加多个使用公共绘制和保存回调的元盒所以我在这1个代谢箱中做了什么,用我的可重复字段的变化。

function add_manual_form() 
 { 
  add_meta_box( \'List_Group1\',
              __( \'List Records\', \'myplugin_textdomain\'  ),
                 \'TEST_card\',
                 \'mmdlist\',
                 \'normal\',
                 \'high\'
                  );            
  }
 add_action( \'add_meta_boxes\', \'add_manual_form\' );
 add_action( \'save_post\', \'save_TESTCARD\');

function TEST_card($post_ID, $Arg)
{
$RecordCnt = TotalRecordsInDatabase($post_ID);
$RecordCnt +=1;
for($i=1; $i<=$RecordCnt; $i ++) 
DrawRecordSet($i);

?>

<form id="ADD_LIST_RECORD" name="ADD_LIST_RECORD" method="post" action="">
 <input type="submit" name="ADD_LIST_RECORD" id="ADD_LIST_RECORD" value="ADD    RECORD" />
</form>


<?php
}


function DrawRecordSet($Index)
{
?>

 <select name="field1_<?php echo $Index; ?>">
 <option value="">Select something...</option>
 <option value="something">Something</option>
 <option value="else">Else</option>
 <option value="too">too</option>
 </select>

<select name="field2_<?php echo $Index; ?>">
  <option value="">Select something...</option>
  <option value="stuff">1</option>
  <option value="junk">Else</option>
  <option value="too">too</option>
</select>
<br /><br /><br />
<?php
// Add a responsive button to add more record sets
}


function save_TESTCARD($post_ID) 
  {
  for($i=1; $i<=3; $i ++)
    {
    if( array_key_exists( \'field1_\'.$i, $_POST ) )
      {
      $InputValue = $_POST[ \'field1_\'.$i ];
      DebugLog(\'Field1_\'.$i.\': \'.$InputValue);
      }

   if( array_key_exists( \'field2_\'.$i, $_POST ) )
     {   
     $InputValue = $_POST[ \'field2_\'.$i];
     DebugLog(\'Field2_\'.$i.\': \'.$InputValue);
     }
  }

}
为了添加新记录并保存当前记录,我添加了一个老式的HTML提交按钮。此按钮不传递任何内容,将强制保存(&A);重画例程。未传递任何数据。

这只是测试代码。它演示了以下内容:

如何将相同字段动态添加到元框中如何确保这些新字段具有唯一的名称如何从这些字段中检索数据,以及如何在元框中找到可重复的字段,而无需所有其他开销。所以除非有人能向我解释为什么这个解决方案是个问题。。我会努力的。我喜欢的是它是小而紧凑的代码,使用数据库作为模拟变量。唯一重要的用途是访问数据库,但由于这是WordPress的管理部分,所以这真的不重要。

相关推荐

Starting with tabbed metabox

我的插件需要一个带选项卡的metabox。实际上,它们是5个代谢箱,每个都在一个选项卡中。我找到了以下脚本:https://speckyboy.com/10-simple-code-snippets-creating-beautiful-tabs/哪一个最适合在元框中使用?最好只有CSS?JS必须注册?我想开始测试这些脚本,但想知道从哪里开始。非常感谢。