这是因为您正在传递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_input
或
filter_var
防止数据库中存储受污染的值。