一次保存所有字段数据的自定义元框


Save custom meta-box all the fields data at once

我在new-post页面上有一个自定义的元框,允许用户连续添加照片。他可以添加越来越多的照片。

所以,我在保存这些数据时遇到了一个问题。因为,字段的数量不相同。

我的代码如下:

if( isset( $_POST[ 'photo-title-1' ] ) ) {
    $photos = array(
        0 => array($_POST[ 'photo-title-0' ], $_POST[ 'photo-url-0' ], $_POST[ 'photo-desc-0' ]),
        1 => array($_POST[ 'photo-title-1' ], $_POST[ 'photo-url-1' ], $_POST[ 'photo-desc-1' ]),
        2 => array($_POST[ 'photo-title-2' ], $_POST[ 'photo-url-2' ], $_POST[ 'photo-desc-2' ])
        ............................................
        ............................................
        ............................................
         n => array($_POST[ 'photo-title-n' ], $_POST[ 'photo-url-n' ], $_POST[ 'photo-desc-n' ])
    );
    $serialized_array = serialize($photos);
    update_post_meta( $post_id, 'photos', sanitize_text_field($serialized_array) );
}

正如您所看到的,可以有n个字段,一次保存所有字段的方法是什么?

您可以在POST数组中使用while进行迭代:

$sum = 0;
while( isset($_POST['photo-title-' . $sum]) ){
    $photos[] = array(
        $_POST[ 'photo-title-' . $sum ],
        $_POST[ 'photo-url-' . $sum ],
        $_POST[ 'photo-desc-' . $sum ]
    );
    $sum++;
}
$serialized_array = serialize($photos);
update_post_meta( $post_id, 'photos', sanitize_text_field($serialized_array) );

编辑

根据评论,POST Array不能包含所有字段,有一个更新可以解决这个问题:

$reg = '/^photo'-(title|url|desc)'-('d+)$/';
$filter = preg_grep($reg, array_keys($_POST));
$photos = array();
foreach($filter as $param){
    $index = preg_replace($reg, '$2', $param);
    if( !isset($photos[$index]) ) $photos[$index] = array();
    $photos[$index][$param] = $_POST[$param];
}
$serialized_array = serialize($photos);
update_post_meta( $post_id, 'photos', sanitize_text_field($serialized_array) );

如果您想要Array中的连续索引,可以添加:

$photos = array_values($photos);