将元值组合成一个新键(PHP / WordPress)

时间:2015-04-28 21:15:58

标签: php mysql wordpress meta-key

这就是我需要做的事情,用外行人的话来说:

对于每个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“;}

但有两个问题:

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

  2. 我想将数组转换为字符串。因此,我没有“返回$ array”,而是试图将其破坏:

    $ comma_separated = implode(“,”,$ array); 返回$ comma_separated;

  3. 但是没有返回任何内容,值为空。我做错了什么? 谢谢!

1 个答案:

答案 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 ) );
});

<强>更新

回答新问题:

  1. 发生这种情况是因为即使FOO_COMBINEDFOO_开头,所以它已被添加到数组中(抱歉,我的错:)。用/^FOO_(?!COMBINED)/替换搜索模式将排除该密钥。
  2. 它应该有效,我不明白它为什么没有。
  3. 我已更新代码以满足您的新要求并对其进行测试:

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