Наконец то смог импортировать пользоватлей из вордпресса в битрикс.
Я уже достаточно написал в обновлениях, чтобы можно было самому уже написать весь код.
Но, на всякий случаи привожу свою версию с комментариями. Может и пригодится:
1. Пользователей мы будем импортировать через стандатный сервис битрикса "импоритровать пользователей". Через него можно импортировать практический все, что относиться к юзерам:
Импорт пользователей через CSV
2. Если хотите импортировать пользовательское свойство, просто укажите название колонки с доп свойством, например UF_USER_FIELD и значения в нем, ( если это не множественное свойство, о множественных ниже).
Если картинку (аватар), просто укажите в колонке PERSONAL_PHOTO относительный путь до картинки. Папку, с которой будут браться картинки, указываете в админ панели при импорте юзеров: "Путь к картинкам относительно корня сайта ".
Теперь к конкретике.
информация о юзерах в вордпрессе хранится в таблицах:
wp_users - логин, пароль, емаил
wp_bp_xprofile_data - аналогия с пользовательскими свойствами битрикса, хранятся значения
wp_bp_xprofile_fields - названия пользовательских свойств
Нужно в запросе связать эти таблицы и создать CSV file.
Example:
// Подключение к БД вордпресса
$mysqli = new mysqli("localhost", "root", "", "wp") or die("Not connected");
if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}
$query = "select
t_users.ID as `UF_OLD_USER_ID` /*Заранее создал поль
свойство с таким именем. Понадобится при импорте аватарок,
да и лучше сохранить старые ИД. На всякий случаи. */
, '1.jpg' as `PERSONAL_PHOTO`
, t_users.user_login as `LOGIN`
, t_users.user_pass as `PASSWORD`
, t_users.user_email as `EMAIL`
, t_users.user_registered as `DATE_REGISTER`
, SUBSTRING_INDEX(t_users.display_name, ' ', 1) as `NAME`
, SUBSTRING_INDEX(t_users.display_name, ' ', -1) as `LAST_NAME`
, max(CASE WHEN t2.name = 'Телефон'
THEN t1.value ELSE null END) as `PERSONAL_PHONE`
, max(CASE WHEN t2.name = 'Город'
THEN t1.value ELSE null END) as `PERSONAL_CITY`
, max(CASE WHEN t2.name = 'Адрес студии'
THEN t1.value ELSE null END) as `UF_ADDRESS`
, max(CASE WHEN t2.name = 'Сайт'
THEN t1.value ELSE null END) as `PERSONAL_WWW`
, max(CASE WHEN t2.name = 'Образ'
THEN t1.value ELSE null END) as `MASTER_SERVICE_1`
, max(CASE WHEN t2.name = 'Визажист'
THEN t1.value ELSE null END) as `MASTER_SERVICE_2`
FROM wp_bp_xprofile_data as t1
INNER JOIN wp_bp_xprofile_fields as t2
on t1.field_id = t2.id
INNER JOIN wp_users t_users
ON t_users.ID = t1.user_id
#where user_id = 3
group by t1.user_id
";
if( !$mysqli->query( $query ) )
{
printf("Error: %s\n<br />", $mysqli->error);
}
$create_q = "";
$res = $mysqli->query( $query);
$fp = fopen('file.csv', 'w+'); // Создание csv файла
while ( $row = $res->fetch_assoc())
{
// Некоторые значения хранятся в сериализированном виде. Преобразуем в массив.
$tmp1 = unserialize($row["MASTER_SERVICE_1"]) ? unserialize($row["MASTER_SERVICE_1"]) : array();
$tmp2 = unserialize($row["MASTER_SERVICE_2"]) ? unserialize($row["MASTER_SERVICE_2"]) : array();
// в Битриксе в сер виде хранятся значения множественных свойств.
$tmp = array_merge( $tmp1, $tmp2);
Есть два пути сохранить значения множ свойств в Битриксе.
Первый, по битриковский: Для каждого значения нужно создать новую строку в CSV.
То есть, в каждой новой строчке должный быть те же данные
у простых типов и меняться значение только у множественного свойства.
И так, пока не переберешь все значения.
Второй, через костыль.
Сохранить все значения множ свойства в массив и:
2.1 Записать значения напрямую в БД битрикса
2.2 Через метод Cuser::update обновить значения у уже созданного пользователя. В качестве значения, нужно передавать как раз массив.
По незнанию я выбрал метод 2.1
Если нужно, подправляем данные в массиве tmp.
Импортируем старые аватарки.
Как я уже писал автарки хранятся как /uploads/avatars/[member_id]/[avatar file]
$pathName = "./uploads-portfolio/avatars/".$row["UF_OLD_USER_ID"]."/";
$entries = scandir( $pathName );
$pattern = "#[\w\d]*-bpfull\.(png|jpg)$#";
foreach($entries as $entry)
{
if ( preg_match($pattern, $entry))
{
$row["PERSONAL_PHOTO"] = "/".$row["UF_OLD_USER_ID"]."/".$entry;
}
}
$tmp = array_unique( $tmp );
// У меня UF_MASTER_SERVICE поль свойство множественного значения
$row["UF_MASTER_SERVICE"] = serialize($tmp);
fputcsv($fp, $row, ";", '"');
}
Файл для импорта почти готов. Не забудьте добавить названия колонок. Сделать можно в Экселе или Libre Calc.
Теперь в init.php добавляем события:
Про сохранение паролей, прочитайте здесь:
dev.1c-bitrix.ru/community/webdev/user/42405/blog/... ( Petr Zhuchkov
Petr Zhuchkov )
AddEventHandler("main", "OnAfterUserAdd", "__afterUserAdd");
function __afterUserAdd( $arParams )
{
if(defined("USER_IMPORT_EXECUTION_TIME"))
{
// Adding multiply property for imported User
// MY_MASTER_SERVICE - название колонки с множественным свойством
// RESULT - ИД только, что созданного пользователя
$mysqli = new mysqli("localhost", "root", "", "bitrix_db");
$sql = "UPDATE b_uts_user SET UF_MASTER_SERVICE = '"
.$arParams["MY_MASTER_SERVICE"]
."' WHERE VALUE_ID =".$arParams["RESULT"];
$result = $mysqli->query( $sql);
if( !$result )
{
echo $mysqli->error;
}
}
}
Будье осторожны при этом методе. Внесенные данные видны в профиле пользователя. Даже берутся методом Getlist. Но, почему то не работают в поиске. А мне как раз нужен был поиск по этому свойству. Выход в цикле обновить значения множ свойства всех пользователей через Cuser::update.
Все.