嘿,伙计们,我在一个项目上有这个积分系统,一切都很好,除了我不能给多个用户添加Meta_values。我正在使用<?php update_user_meta( $user_id, $meta_key, $meta_value, $prev_value ) ?>,但这似乎不适用于多个用户。你知道吗?
<?php update_user_meta( $user_id, $meta_key, $meta_value, $prev_value ) ?>
thtygnil1#
你只是简单地传递一个带有user_ids的数组给update_user_meta吗?那么它实际上不会工作。在所有user_id上使用循环,它应该可以工作:
update_user_meta
foreach($user_ids as $user_id){ update_user_meta($user_id, $key, $value); }
字符串想想生成的SQL,同时记住WordPress的数据库设计。它有一个表wp_usermeta,列user_id,meta_key和meta_value。这意味着每个Meta值在这个表中都有一行,每个用户。你可以使用一些代码,
wp_usermeta
user_id
meta_key
meta_value
global $wpdb; $ids = implode("', '", $user_ids); $wpdb->query($wpdb->prepare("UPDATE {$wpdb->usermeta} SET meta_value = %s WHERE user_id IN ('{$ids}') AND meta_key = %s"), $value, $key);
型但是,如果某个用户的meta_key还不存在,这就不起作用了,这时你就需要一个INSERT语句,而这在批处理中是做不到的。
INSERT
jum4pzuy2#
你可以尝试类似的东西;
$user_meta_fields = array ( 'first_name', 'last_name', 'account_type', 'vd_sub_name', 'description', 'vd_adress', 'vd_cp', 'vd_ville', 'vd_department', 'vd_region', 'vd_country', 'vd_tel', 'vd_gsm', 'vd_fax', 'url' ); foreach($user_meta_fields as $user_meta_field){ //echo "update_user_meta(".$user_id.", ".$user_meta_field.", ".$posted[$user_meta_field].");"; update_user_meta($user_id, $user_meta_field, $posted[$user_meta_field]); }
字符串
iaqfqrcu3#
这是我做的东西:
/* * Optimized way to add multiple usermeta keys and values * @author Ivijan-Stefan Stipic */ if( !function_exists('bulk_update_user_meta') ) : function bulk_update_user_meta(int $user_id, array $meta_data) { global $wpdb; $transactions = 0; foreach ($meta_data as $meta_key => $meta_value) { $meta_data[$meta_key] = [ 'exists' => $wpdb->get_var($wpdb->prepare( "SELECT COUNT(*) FROM `{$wpdb->usermeta}` WHERE `user_id` = %d AND `meta_key` = %s", $user_id, $meta_key )) > 0, 'value' => maybe_serialize($meta_value) ]; } $wpdb->query('START TRANSACTION'); foreach ($meta_data as $meta_key => $meta_object) { $meta_value = $meta_object['value']; if ( $meta_object['exists'] ) { if( $wpdb->query($wpdb->prepare( "UPDATE `{$wpdb->usermeta}` SET `meta_value` = %s WHERE `user_id` = %d AND `meta_key` = %s", $meta_value, $user_id, $meta_key )) !== false ) $transactions++; } else { if( $wpdb->query($wpdb->prepare( "INSERT INTO `{$wpdb->usermeta}` (`user_id`, `meta_key`, `meta_value`) VALUES (%d, %s, %s)", $user_id, $meta_key, $meta_value )) !== false ) $transactions++; } } $wpdb->query('COMMIT'); clean_user_cache($user_id); return $transactions === count($meta_data); } endif;
字符串用途:
bulk_update_user_meta( $user_id, [ 'ivi_test__1' => mt_rand( 1, 100 ), 'ivi_test__2' => mt_rand( 1, 100 ), 'ivi_test__3' => mt_rand( 1, 100 ), 'ivi_test__4' => mt_rand( 1, 100 ), 'ivi_test__5' => mt_rand( 1, 100 ), 'ivi_test__6' => mt_rand( 1, 100 ), 'ivi_test__7' => mt_rand( 1, 100 ), 'ivi_test__8' => mt_rand( 1, 100 ), 'ivi_test__9' => mt_rand( 1, 100 ), 'ivi_test__10' => mt_rand( 1, 100 ), 'ivi_test__11' => mt_rand( 1, 100 ), 'ivi_test__12' => mt_rand( 1, 100 ), ] );
型
3条答案
按热度按时间thtygnil1#
你只是简单地传递一个带有user_ids的数组给
update_user_meta
吗?那么它实际上不会工作。在所有user_id上使用循环,它应该可以工作:
字符串
想想生成的SQL,同时记住WordPress的数据库设计。它有一个表
wp_usermeta
,列user_id
,meta_key
和meta_value
。这意味着每个Meta值在这个表中都有一行,每个用户。你可以使用一些代码,型
但是,如果某个用户的
meta_key
还不存在,这就不起作用了,这时你就需要一个INSERT
语句,而这在批处理中是做不到的。jum4pzuy2#
你可以尝试类似的东西;
字符串
iaqfqrcu3#
这是我做的东西:
字符串
用途:
型