将元值组合成一个新键 (PHP/WordPress)
Combine meta values into a new key (PHP/WordPress)
这是我需要做的,通俗地说:
对于每个 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:"Test, May 15, 2015, Score: 80, Hours: 30 ";s:11:"WORKSHOP_30";s:68:"Middle School Civics & Economics, Jun 04, 2015, Score: 12, Hours: 43"; }
但是有两个问题:
每次我更新配置文件时,它都会向 WORKSHOP_COMBINED 键添加另一个组合值,而不是替换该值。即使它说 update_meta 而不是 add_meta。你知道为什么会这样吗?
我想将数组转换为字符串。所以我没有 "return $array",而是试图像这样内爆它:
$comma_separated = 内爆(",", $array);
return$comma_separated;
但是 return 什么都没有,而且值为空。我做错了什么?
谢谢!
这里是:
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 ) );
});
这是我需要做的,通俗地说:
对于每个 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:"Test, May 15, 2015, Score: 80, Hours: 30 ";s:11:"WORKSHOP_30";s:68:"Middle School Civics & Economics, Jun 04, 2015, Score: 12, Hours: 43"; }
但是有两个问题:
每次我更新配置文件时,它都会向 WORKSHOP_COMBINED 键添加另一个组合值,而不是替换该值。即使它说 update_meta 而不是 add_meta。你知道为什么会这样吗?
我想将数组转换为字符串。所以我没有 "return $array",而是试图像这样内爆它:
$comma_separated = 内爆(",", $array); return$comma_separated;
但是 return 什么都没有,而且值为空。我做错了什么? 谢谢!
这里是:
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 ) );
});