【问题标题】:Combine meta values into a new key (PHP/WordPress)将元值组合成一个新键(PHP/WordPress)
【发布时间】:2015-05-01 00:37:43
【问题描述】:

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

对于每个 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. 我想把数组变成一个字符串。所以我没有尝试“return $array”,而是尝试像这样内爆它:

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

但这什么也不返回,而且值是空的。我做错了什么? 谢谢!

【问题讨论】:

    标签: php mysql wordpress meta-key


    【解决方案1】:

    这里是:

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

    【讨论】:

    • @Lindsay 嗨,你有没有尝试过?我很想知道一切是否按预期进行:)
    • 好的,所以我尝试了,它有点工作。我有两个名为“WORKSHOP_30”和“WORKSHOP_5”的键。该函数创建了两个具有相同值的新键,称为“WORKSHOP_COMBINED_WORKSHOP_30”和“WORKSHOP_COMBINED_WORKSHOP_5”。在个人选项更新期间,我使用了您的第一个代码块,然后使用了您的第三个代码块来调用它。对吗?
    • 很奇怪,我刚刚重新测试了它,它可以工作。你确定你使用了完全相同的代码吗?你有没有包括一些循环?更新的行应该是update_user_meta( $user_id, 'WORKSHOP_COMBINED', combine_keys( $user_id ) );
    • 好的,我得到它来组合键...通过删除元并重新开始。谢谢你。但是,我有一个新问题,我已经在上面的代码中更新了它。每次我点击“更新配置文件”而不是替换时,它都会添加另一个组合值。
    • 我不知道为什么它对我不起作用,但新代码无法创建/更新密钥。我相信你它有效,所以我不知道出了什么问题。您的原始代码仍然有效(除了值加倍),所以我回到那个并更改了新键的名称,因此它没有使用 WORKSHOP_,这解决了重复问题。但是,我仍然无法让内爆工作。一旦我添加它,该值就是空的。疯狂的。有没有另一种方法可以把它变成一个字符串?我将把它标记为正确,即使它还没有完全适合我。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2019-12-05
    • 1970-01-01
    • 2022-06-15
    • 2022-08-18
    相关资源
    最近更新 更多