0

用外行的话来说,这是我需要做的:

对于每个 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:"中学公民& Economics, Jun 04, 2015, Score: 12, Hours: 43";}

但是有两个问题:

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

  2. 我想把数组变成一个字符串。因此,我尝试像这样内爆它,而不是“return $array”:

    $comma_separated = implode(",", $array); 返回 $comma_separated;

但这不返回任何内容,并且该值为空。我做错了什么?谢谢!

4

1 回答 1

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 之前立即调用它(可能使用插件提供的挂钩),或者您可以在需要时安排它

或者,您可以让单个用户在更新个人资料时保存他的个人组合密钥:

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

});
于 2015-04-29T01:30:03.417 回答