Wordpress 是否可以在一次调用中从数组更新post meta?
代码片段:Wordpress 是否可以在一次调用中从数组更新post meta?,wordpress,optimization,updates,Wordpress,Optimization,Updates,代码片段: $save_dbarray = array( 'email' => 'email@email.se', 'adress' => 'adress' ); //Save values from created array into db foreach($save_dbarray as $meta_key=>$meta_value) { update_post_meta($post_id, $meta_key, $m
$save_dbarray = array(
'email' => 'email@email.se',
'adress' => 'adress'
);
//Save values from created array into db
foreach($save_dbarray as $meta_key=>$meta_value) {
update_post_meta($post_id, $meta_key, $meta_value);
}
有没有办法优化上述代码?在这个简单的场景中,这无关紧要,但是如果我有一个大的数组,那么我猜更新时可能会出现性能问题
我想做一些类似的事情:
update_post_meta($post_id, $save_dbarray);
这可能吗?为什么不试试这样的方法:
根据文档,您可以将$meta_值作为数组传递,该数组将被序列化为字符串
$save_dbarray = array(
'email' => 'email@email.se',
'adress' => 'adress'
);
update_post_meta($post_id, 'my_custom_fields', $save_dbarray);
一次可能有多个值您可以将您的值genearte转义为
$escaped_json = '{"key":"value with \\"escaped quotes\\""}';
update_post_meta( $id, 'double_escaped_json', wp_slash($escaped_json) );
虽然其他答案是你问题的创造性解决方案,但它们似乎没有解决实际问题或回答你的问题 答案 不可以。WordPress的
更新\u post\u meta
一次只能在一个字段上工作。您最好的选择是坚持上面使用的方法,使用foreach
循环。其他答案提供了将该元存储在单个字段中的方法,这可能对某些人来说是好的,但(在我的例子中)有些人需要查询这些值,而使用序列化或JSON编码的数组并不能解决这一问题
不幸的是,WP没有提供“批量元更新”方法,如果它提供了,则很可能是一个foreach
循环。您始终可以编写一个函数来帮助代码更干净,至少:
<?php
function update_post_meta_array( $post_id, $meta ) {
if ( ! get_post( $post_id ) || ! is_array( $meta ) || empty( $meta ) ) {
return false;
}
foreach ( $meta as $meta_key => $meta_value ) {
update_post_meta( $post_id, $meta_key, $meta_value );
}
return true;
}
phatskat是正确的,因为没有内置的方法来实现这一点,并且需要foreach循环 这是我发现的最有效率的一篇博文,也是这样写的:
add_action('init', 'bulk_update_post_meta_data');
function bulk_update_post_meta_data() {
$args = array(
'posts_per_page' => -1,
'post_type' => 'POSTTYPEHERE',
'suppress_filters' => true
);
$posts_array = get_posts( $args );
foreach($posts_array as $post_array) {
update_post_meta($post_array->ID, 'POSTMETAKEY', 'NEWVALUE');
}
}
谢谢你的回答!你说$meta_键应该是什么意思?meta_键应该是电子邮件、地址等。@bestprogrammerintheworld我更新了代码,其中
my_custom_fields
是返回序列化数组的键的名称,只需取消序列化并与array.Hm一起使用即可。它确实执行序列化/取消序列化部分,但实际上并不更新数据库。然后我发现,在使用WP时,您应该使用可能的_serialize()和可能的_unserialize()。我发现这个序列化是自动完成的@bestprogrammerintheworld啊,我错过了这个(混合)(必需)自定义字段的新值。传递的数组将序列化为字符串代码>用于元值,来自文档。。是的,新值将被传递到字符串中。在您的情况下,键“my_custom_fields”将以序列化字符串形式保存数组$save_dbarray(如果我正确理解文档)。不幸的是,我没有你的代码来工作。我认为如果你想让每个元素都有自己的键,这是最好的方法(当然,如果它都可以在一个键下运行,只需将整个数组传入,然后在另一端使用可能不序列化。我认为在某种程度上使用多个键会更好,因为这样可以更容易地删除它们等。我几乎会按原样使用您的循环,但如果该键存在,请添加一个检查,如果存在,请使用添加post\u meta
)不需要。你也可以在数组中包含空字符串的检查,然后调用delete\u post\u meta
,如果你愿意的话。这取决于你以后想对这些数据做什么。这实际上不会做任何传入数组然后使用可能不序列化的事情。此外,你不能“轻松地”并在基本字符串匹配之外可靠地查询这种类型的数据。其思想是,您不能使用此方法执行get\u post\u meta($post\u id,'key',true);
或类似操作。