这就是我需要做的事情,用外行人的话来说:
对于每个wordpress用户, 找到以“FOO_”开头的每个元键 然后将所有元值组合成一个名为“FOO_COMBINED”的新键
我的问题是指WordPress,但我认为通常适用于PHP或SQL,我希望这是适当的论坛。
我通常从我发现的相关答案中了解到,我需要做这样的事情:
function combine_keys() {
$array = // the array of (all?) user meta
foreach ($array as $key => $value) {
if (substr($key, 0, 4) == "FOO_") {
// grab the $value and append it to another key??
}
}
}
但我不知道如何将其翻译成WordPress功能。
我知道get_users()
将获得所有用户。 get_user_meta($user_id)
将获取特定用户ID的所有用户元数据。但我不知道如何将它们实现到上面的函数中。我们有很多用户,因此需要高效完成。
我的另一个问题是何时调用该函数。这样做的目的是导出CSV。我正在使用用户导出插件,但我需要将所有FOO_键(以换行符分隔的值)合并为一个键,这样我们就不必导出一百万个FOO_列。
**更新**
这是我更新的代码尝试使用实现下面的答案。我把它放到functions.php。
中function combine_keys( $user_id ) {
$array = array();
$all_meta = get_user_meta( $user_id );
foreach( $all_meta as $key => $meta ) {
if( preg_match('/^WORKSHOP_/', $key) )
$array[$key] = $meta[0];
}
return $array;
}
add_action('personal_options_update', function( $user_id ){
if ( current_user_can('edit_user', $user_id) )
update_user_meta( $user_id, 'WORKSHOP_COMBINED', combine_keys( $user_id ) );
});
这可以创建一个新的键(称为WORKSHOP_COMBINED),它成功地将值组合成这样的数组:
a:2:{s:10:“WORKSHOP_5”; s:43:“测试,2015年5月15日,得分:80,小时:30”; s:11:“WORKSHOP_30”; s:68:“中学公民与经济学,2015年6月4日,得分:12,小时:43“;}
但有两个问题:
每当我更新配置文件时,它会将另一个组合值添加到WORKSHOP_COMBINED键,而不是替换该值。即使它说update_meta而不是add_meta。你知道为什么会这样吗?
我想将数组转换为字符串。因此,我没有“返回$ array”,而是试图将其破坏:
$ comma_separated = implode(“,”,$ array); 返回$ comma_separated;
但是没有返回任何内容,值为空。我做错了什么? 谢谢!
答案 0 :(得分:0)
这是:
function combine_keys( $user_id ) {
$array = array();
$all_meta = get_user_meta( $user_id );
foreach( $all_meta as $key => $meta ) {
if( preg_match('/^FOO_/', $key) )
$array[$key] = $meta[0];
}
return $array;
}
您可以像这样创建组合键:
foreach (get_users() as $user) {
$combined_meta = combine_keys( $user->ID );
update_user_meta( $user->ID, 'FOO_COMBINED', $combined_meta );
}
至于何时调用它,您可以在导出CSV之前执行此操作(可能使用插件提供的挂钩),或者您可以在需要时schedule it。
或者您可以让单个用户在更新其个人资料时保存他的个人组合密钥:
add_action('personal_options_update', function( $user_id ){
if ( current_user_can('edit_user', $user_id) )
update_user_meta( $user_id, 'FOO_COMBINED', combine_keys( $user_id ) );
});
<强>更新强>
回答新问题:
FOO_COMBINED
以FOO_
开头,所以它已被添加到数组中(抱歉,我的错:)。用/^FOO_(?!COMBINED)/
替换搜索模式将排除该密钥。我已更新代码以满足您的新要求并对其进行测试:
function combine_keys( $user_id ) {
$array = array();
$all_meta = get_user_meta( $user_id );
foreach( $all_meta as $key => $meta ) {
if( preg_match('/^FOO_(?!COMBINED)/', $key) )
$array[$key] = $meta[0];
}
return implode(',', $array);
}
add_action('personal_options_update', function( $user_id ){
if ( current_user_can('edit_user', $user_id) )
update_user_meta( $user_id, 'FOO_COMBINED', combine_keys( $user_id ) );
});