有没有办法将新值添加到存储的自定义字段值?

时间:2018-06-26 作者:D. Merchant

我试图在不同的时间将一些数字作为自定义字段保存到帖子中。我想存储一个数组,其中包含每个帖子的选定数字。但我无法更新当前值(自定义字段数组)。以下是我的代码:

$new_number = $_POST[\'number\'];
$old_numbers = get_post_meta( $post_id, \'numbers\', false );

if( empty( $old_numbers ) ){
    add_post_meta( $post_id, \'numbers\', $new_number );
}else{
    array_push( $old_numbers, $new_number );
    update_post_meta( $post_id, \'numbers\', $old_numbers );
}
但它不起作用。存储的数组(序列化)格式错误。我找不到任何解决办法。我怎样才能做到这一点?

1 个回复
最合适的回答,由SO网友:guido 整理而成

这是因为您正在传递false作为第三个参数,这意味着您正在使用相同的键检索所有元。

第一次存储值时,meta不存在,并且该值作为字符串存储到DB中,第二次存储序列化的值时,这是唯一一次将该值作为包含单个数组中的值的数组进行检索。

第三次,您将收到一个数组,其中第一个to值存储在第一个数组中,第三个值存储在另一个索引中,但不在第一个数组中。

更清楚地说。

[
  [
    0 => \'a\', 
    1 => \'b\',
  ]
  [
    0 => \'c\',
  ]
]
如果要将数据存储在相同的值内,则必须传递true 作为第三个参数,我建议通过true 作为的第四个参数add_post_meta 所以你让这篇文章变得独一无二。

在任何情况下,只要确保您始终检索到一个数组,我建议您对检索到的值进行强制转换和过滤。

因此,第一次转换为数组的值将是一个值为0的数组,因为get_post_meta 将返回false.

如果过滤数组,我们将只得到正确的值。请注意,可以计算为false的值可以从meta中去除。

所以如果你认为0 作为元的值,不要使用array_filter.

$new_number = $_POST[\'number\'];
$old_numbers = array_filter((array) get_post_meta( $post_id, \'numbers\', true ));

if( empty( $old_numbers ) ){
    add_post_meta( $post_id, \'numbers\', $new_number, true );
}else{
    array_push( $old_numbers, $new_number );
    update_post_meta( $post_id, \'numbers\', $old_numbers );
}
而是:

$new_number = $_POST[\'number\'];
$old_numbers = get_post_meta( $post_id, \'numbers\', true );

if( ! $old_numbers ) {
    $old_numbers = [];
}

if( empty( $old_numbers ) ) {
    add_post_meta( $post_id, \'numbers\', array($new_number), true );
} else {
    $old_numbers = array_merge((array) $old_numbers, (array)$new_number);
    update_post_meta( 1, \'numbers\', $old_numbers );
}
另外,直接使用$\\u POST值并不总是一个好主意,请使用filter_inputfilter_var 防止数据库中存储受污染的值。

结束