当同一个元关键字使用多个元值时,WordPress将这些值存储在不同的数据库行中。因此,每个数组都存储在一行中。
初始数据
假设您有这样一个数组:
$family = [
\'father\' => [ \'John\', \'Doe\', 40 ],
\'mother\' => [ \'Jane\', \'White\', 39 ],
\'child_1\' => [ \'Luke\', \'Doe\', 5 ]
];
如果将每个子数组存储为不同的元行,则该行的唯一标识符是
meta_id
但它并没有真正的意义,而且很难使用WordPress函数。
“映射”方法可以是在另一个post meta中存储值/元ID的映射。
这是可以做到的,因为update_post_meta()
和add_post_meta()
返回刚刚添加的元ID。
存储数据,以便执行以下操作:
$map = [];
foreach( $family as $who => $person ) {
// update_post_meta returns the meta ID
$map[ $who ] = update_post_meta( $postId, \'family_member\', $person );
}
// we store the map of family "role" to meta IDs in a separate meta
update_post_meta( $postId, \'family_members_map\', $map );
检索值时检索数据,例如。
$family = get_post_meta( $postId, \'family_member\' );
得到如下二维无眼数组:
[
[ \'John\', \'Doe\', 40 ],
[ \'Jane\', \'White\', 39 ],
[ \'Luke\', \'Doe\', 5 ],
]
简而言之,您松开了子数组键。
但您可以使用存储的地图和函数get_post_meta_by_id
要重新创建原始数据,请执行以下操作:
$map = get_post_meta( $postId, \'family_members_map\', true );
$family = array_combine( array_keys( $map ), array_map( \'get_post_meta_by_id\', $map ) );
和族将等于原始数据:
[
\'father\' => [ \'John Doe\', 40 ],
\'mother\' => [ \'Jane White\', 39 ],
\'child_1\' => [ \'Luke Doe\', 5 ]
]
更新数据,这并不难:
$justBorn = [ \'Anna\', \'Doe\', 0 ];
// current map
$map = get_post_meta( $postId, \'family_members_map\', true);
// add both new sub array and new meta ID to map
$map[\'child_2\'] = update_post_meta( $postId, \'family_member\', $justBorn );
// update the map
update_post_meta( $postId, \'family_members_map\', $map );
另一种选择是:“一体式”方法上述方法可行,但不是最简单的方法。
事实上,存储整个初始关联数组($family
数组)是单个元,而不是在不同的子数组中。
// store data
update_post_meta( $postId, \'family_members\', $family );
// retrieve data (please note the `true` as 3rd argument)
$family = get_post_meta( $postId, \'family_members\', true );
// update data
$family = get_post_meta( $postId, \'family_members\', true );
$family[\'child_2\'] = [ \'Anna\', \'Doe\', 0 ];
update_post_meta( $postId, \'family_members\', $family );
存储、检索和更新数据非常容易,并且没有额外的开销。
“地图”方法的优点在大多数情况下,“一体式”方法最为方便。
但是,如果有数百甚至数千个子数组,使用唯一的元值来存储它们将导致获取和解析数据所需的大量内存。使用不同的行和现代PHP功能,如generators, 这样的内存量可以大大减少。
此外,在处理现有数据(可能是从网站的旧版本继承来的)时,这种方法有助于在不转换旧数据的情况下获得有意义的信息。
最后,在不同的DB行中存储更小、更具特征的子数组,使用元查询和LIKE
即使实际的可靠性在很大程度上取决于数据的结构,与元数据中的序列化数组相比,可以更容易、更可靠。