Вот что мне нужно сделать, с точки зрения непрофессионалов:
Для каждого пользователя 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: «WORKSHOP_5»; s: 43: «Тест, 15 мая 2015 г., оценка: 80, часы: 30»; s: 11: «WORKSHOP_30»; s: 68: «Civics средней школы» & Экономика, 04 июня 2015, оценка: 12, часы: 43 «;}
Но есть две проблемы:
Каждый раз, когда я обновляю профиль, он добавляет другое комбинированное значение к ключу WORKSHOP_COMBINED, а не заменяет его. Несмотря на то, что он говорит update_meta, а не add_meta. Вы знаете, почему это происходит?
Я хотел бы превратить массив в строку. Поэтому вместо «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 ) );
});
ОБНОВИТЬ
Отвечая на новые вопросы:
FOO_COMBINED
начинается с FOO_
, так что он добавлен в массив (извините, я виноват :). Замена шаблона поиска на /^FOO_(?!COMBINED)/
исключит этот ключ.Я обновил код в соответствии с вашими новыми требованиями и протестировал его:
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 ) );
});
Других решений пока нет …