从表单创建的多维数组中的数据的UPDATE_POST_META

时间:2016-03-12 作者:Kev

因此,我有几个表单字段,如下所示:

<input name=\'mainStageSatOrder[theband][theid]\' type=\'hidden\' class=\'band-id\' value=\'\' />";
<input name=\'mainStageSatOrder[theband][theorder]\' type=\'hidden\' class=\'band-order\' value=\'\' />";
如您所见,这些表单字段(其中有更多表单字段,这只是这两种类型的示例)创建了一个多维数组,如下所示(我希望,如果我错了,请纠正我):

Array (
[mainStageSatOrder] => Array
    (
        [theband] => Array
            (
                [theid] => 1
                [theorder] => 5
            )

        [theband] => Array
            (
                [theid] => 2
                [theorder] => 8
            )
    )
)
我希望这些值在提交页面更新时使用update\\u post\\u元函数更新相关字段。我知道我可以加入submit操作post\\u submitbox\\u start操作,我对此非常理解。

我不确定的是,一旦单击提交按钮,PHP可能会是什么样子。我想做的是,当单击submit按钮时,多维数组将使用foreach循环,对于每个“theband”子数组,这两个值将在update\\u post\\u元函数中使用。

foreach(???) {
    update_post_meta( 1, \'theorder\', \'5\' ); //where 1 and 5 are values passed from the MD array
}
因此,过程如下:

1) 用户单击发布/更新按钮2)将所有字段中的所有值传递到多维数组3)循环MD数组,并使用update\\u post\\u meta更新相关数据4)确认是/否

谢谢

2 个回复
SO网友:Abhik

首先,您的阵列有问题。数组不能有重复的键。因此,只保存第一个密钥。你需要把你的表格改成这样。

<input name=\'mainStageSatOrder[theband0][theid]\' type=\'hidden\' class=\'band-id\' value=\'\' />";
<input name=\'mainStageSatOrder[theband0][theorder]\' type=\'hidden\' class=\'band-order\' value=\'\' />";
<input name=\'mainStageSatOrder[theband1][theid]\' type=\'hidden\' class=\'band-id\' value=\'\' />";
<input name=\'mainStageSatOrder[theband1][theorder]\' type=\'hidden\' class=\'band-order\' value=\'\' />";
阵列将如下所示

$array = array(
    \'mainStageSatOrder\' => array(
        \'theband0\' => array(
            \'theid\' => 1,
            \'theorder\' => 5
        ),
        \'theband1\' => array(
            \'theid\' => 2,
            \'theorder\' => 8
        )
    )
);
保存元数据时不需要foreach循环。您可以将其另存为数组。WordPress会自动为您序列化它。

$array = $_POST[\'mainStageSatOrder\'];
update_post_meta( $postid, \'mainStageSatOrder\', $array );  
并且,在检索值时。。

$data = get_post_meta($post->ID, \'mainStageSatOrder\', true);  
返回的$data 将是一个数组。

SO网友:iantsch

您的MD数组在思维上有点问题,应该是这样的,否则您将覆盖表单中的数据:

["mainStageSatOrder"]=> array(2) {
    [0]=> array(1) {
        ["theband"]=> array(2) {
            ["theid"]=> int(1)
            ["theorder"]=> int(5)
        }
    }
    [1]=> array(1) {
        ["theband"]=> array(2) {
            ["theid"]=> int(2)
            ["theorder"]=> int(8)
        }
    }
}
现在您有了两个选项(我推荐选项B,因为您可能不需要没有上下文的单个元数据)

Option A: 将数据保存在单个元字段中。您将需要parent\\u密钥($key\'mainStageSatOrder\'), $row_id 和field\\u id($sub_key$key) 获取您的数据。

function save($post_id) {
    if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE )
        return;
    if ( !current_user_can( \'edit_post\', $post_id ) || !array_key_exists(\'mainStageSatOrder\', $_POST) )
        return;
    foreach ($_POST[\'mainStageSatOrder\'] as $row_id => $rows) {
        foreach ($rows as $key => $value) {
            if (is_array($value)) {
                foreach ($value as $sub_key => $sub_value) {
                    $meta_key = \'_\'.$key.\'_\'.$row_id.\'_\'.$sub_key;
                    update_post_meta($post_id, $meta_key, $sub_value);
                }
            } else {
                $meta_key = "_mainStageSatOrder_".$row_id."_".$key;
                update_post_meta($post_id, $meta_key, $value);
            }
        }
    }
    update_post_meta($post_id, \'_mainStageSatOrder\', array_keys($_POST[\'mainStageSatOrder\']));
}
Option B: 将数据保存在序列化数组中(WordPress处理序列化)。要再次访问和处理阵列,只需unserialize() meta\\u值。

function save_array($post_id) {
    if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE )
        return;
    if ( !current_user_can( \'edit_post\', $post_id ) || !array_key_exists(\'mainStageSatOrder\', $_POST) )
        return;
    update_post_meta($post_id, \'_mainStageSatOrder\', $_POST[\'mainStageSatOrder\']);
}
PHP代码中的某个地方:

$mainStageSatOrder = unserialize(
    get_post_meta(
        get_the_ID(), 
        \'_mainStageSatOrder\', 
        true
    )
);

相关推荐

Foreach循环内的if/ellif in_array仅显示一个POST的问题

如果某个类别的帖子对应一个类别,我会尝试为每个帖子指定一个特定的背景色。我的函数可以工作,但仅限于在结果中显示一篇文章。如果我删除此功能,将显示所有帖子。更多信息:在我的页面上,我有按类别筛选帖子的按钮。如果单击一次,我将显示该类别的所有帖子。但每个帖子都包含几个类别。我选择了一些类别来为每个帖子设置背景色,但这些类别与过滤器按钮不同。Wordpress显示此错误;您的站点出现严重错误,请了解有关调试WordPress的详细信息"E;在显示第一个帖子之后。以下是我的全部代码:<?php&#x