Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wordpress 是否可以在一次调用中从数组更新post meta?_Wordpress_Optimization_Updates - Fatal编程技术网

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);
或类似操作。