当使用ADD_POST_META和UPDATE_POST_META时,有没有办法为各个数组分配密钥?

时间:2015-10-21 作者:George Kendros

将数组添加到post meta时,使用add\\u post\\u meta会添加新的子数组。我想知道是否有办法命名这些子数组。

所以不是以

array([0](2,3), [1](4,5))
我会得到

array ([meaningful_name](2,3),[meaningful_name2](4,5))

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

当同一个元关键字使用多个元值时,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 即使实际的可靠性在很大程度上取决于数据的结构,与元数据中的序列化数组相比,可以更容易、更可靠。

SO网友:jas

使用add\\u post\\u meta的一些可能方法:

For details please follow link

add_post_meta($post_id, $meta_key, $meta_value, $unique);
update_post_meta($post_id, $meta_key, $meta_value, $prev_value);
$meta_values = get_post_meta( $post_id, $key, $single );



 update_post_meta($post_ID, {key}, {array of vals})

 $data = Array(
    \'url\' => $url,
    \'name\' => $name,
    \'description\' => $desc,
 );

 //Update inserts a new entry if it doesn\'t exist, updates otherwise
  update_post_meta($post_ID, \'yourkey\', $data);

 //To Fetch
 $yourdata = get_post_meta($post_ID, \'yourkey\');

Codex link for details

谢谢

相关推荐

网站警告:CALL_USER_FUNC_ARRAY()要求参数1是有效的回调,类‘WPPR_Public’没有方法‘amp_Support’

警告:call_user_func_array() 要求参数1为有效回调,类“Wppr\\u Public”在/home1/thrfolde/Public\\u html/3foldtraining/wp includes/class wp hook中没有方法“amp\\u support”。php在线288如何解决此错误?https://3foldtraining.com/ - 在顶部标题上(如果双击黑条,可以看到该错误) // Avoid the array_slice if p