Вот что мне нужно сделать, говоря простым языком:
Для каждого пользователя 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)
получит все пользовательские мета-данные для определенного идентификатора пользователя. Но я не знаю, как реализовать их в приведенной выше функции. У нас много пользователей, поэтому нужно делать это качественно.
Другой мой вопрос - когда вызывать функцию. Это делается для экспорта 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: "МАСТЕРСКАЯ_5"; s: 43: "Тест, 15 мая 2015 г., оценка: 80, количество часов: 30"; s: 11: "МАСТЕРСКАЯ_30"; s: 68: "Гражданское воспитание в средней школе И экономика, 4 июня 2015 г., оценка: 12, количество часов: 43 ";}
Но есть две проблемы:
Каждый раз, когда я обновляю профиль, он ДОБАВЛЯЕТ другое комбинированное значение в ключ WORKSHOP_COMBINED, а не заменяет это значение. Хотя там написано update_meta, а не add_meta. Вы знаете, почему это происходит?
Я хочу превратить массив в строку. Поэтому вместо "return $ array" я попытался взорвать его вот так:
$ comma_separated = implode (",", $ массив); вернуть $ comma_separated;
Но это ничего не возвращает, и значение пусто. Что я сделал не так? Спасибо!