簡體   English   中英

將元值組合成新的鍵(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:“測試,2015年5月15日,得分:80,小時數:30”; s:11:“ WORKSHOP_30”; s:68:“中學公民&Economics,2015年6月4日,得分:12,小時:43“;}

但是有兩個問題:

  1. 每當我更新配置文件時,它會將另一個組合值添加到WORKSHOP_COMBINED鍵中,而不是替換該值。 即使它說的是update_meta而不是add_meta。 你知道為什么會這樣嗎?

  2. 我想將數組轉換為字符串。 因此,我沒有像“ return $ array”那樣內爆:

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

但這不返回任何值,並且該值為空。 我做錯了什么? 謝謝!

這里是:

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_COMBINEDFOO_ ,所以將其添加到數組中(很抱歉,我的錯:)。 /^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 ) );

});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM