将元值组合成一个新键 (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"; }

但是有两个问题:

  1. 每次我更新配置文件时,它都会向 WORKSHOP_COMBINED 键添加另一个组合值,而不是替换该值。即使它说 update_meta 而不是 add_meta。你知道为什么会这样吗?

  2. 我想将数组转换为字符串。所以我没有 "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 ) );
});

更新

回答新问题:

  1. 发生这种情况是因为即使 FOO_COMBINED 也以 FOO_ 开头,所以它被添加到数组中(抱歉,我的错:)。用 /^FOO_(?!COMBINED)/ 替换搜索模式将排除该键。
  2. 应该可以,但我不明白为什么不行。

我已经更新了代码以满足您的新要求并对其进行了测试:

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 ) );

});