Задать вопрос

Как перенести БД пользователей из WordPress в 1С Битрикс?

Здравствуйте.
Есть задача перенести пользователей из из WordPress 3.9x в 1С Битрикс 15.0x стандарт.
Кроме пользователей ничего переносит не надо.

Пока заметил, что информация о пользователях в WordPress хранится в двух таблицах:
Wp_users - хранятся данные об авторизация, логин, емаил, пароль.
Wp_users_meta - доп данные, имя, фамилия.

Правильно ли это или существуют другие таблицы, в которых есть информация о пользователях?

В пользователях битрикса также существуют доп свойства.
13ed4cf34d7244748ad56be04967aa2a

В Бд битрикса есть таблица b_users, но там хранятся стандатные значения, такие как логин, емаил, пасс.
Как связать это с доп свойствами?

Обновление №1:
Пока прогуглил это:
promst59.ru/page/bitrix-struktura-bazy-dannyh-modu...

Обновление №2:
Гуглением выснено, что Вордпрес не хранит аватарки в БД.
https://buddypress.org/support/topic/were-is-avata...
Avatars don’t have a database entry. They live here:
/wp-content/uploads/avatars/[member_id]/[avatar file]
But there needs to be a thumb and a full-size, and you’ll need to change the file names.
And they may need to be jpg.
For example:
4f5664228829d-bpthumb.jpg
4f5664228829dauto-bpfull.jpg


Обновление №3
При обьединении таблиц вам может помочь этот ресурс:
www.k-press.ru/cs/2010/2/sqlrecept%5Csqlrecept2.as...
  • Вопрос задан
  • 5063 просмотра
Подписаться 4 Оценить 1 комментарий
Решения вопроса 1
Express777
@Express777 Автор вопроса
Наконец то смог импортировать пользоватлей из вордпресса в битрикс.
Я уже достаточно написал в обновлениях, чтобы можно было самому уже написать весь код.
Но, на всякий случаи привожу свою версию с комментариями. Может и пригодится:

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.

Все.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
kompi
@kompi
nullstack devoops
Добавляется таблица с пользователями из WP в бд битрикса.
Далее, либо руками напрямую в бд запросы (джойны/подзапросы), либо написать небольшой скрипт.
Ответ написан
Комментировать
babarun
@babarun Куратор тега 1С-Битрикс
Безумный план моих идей в руках больных людей
Express777 : про какие дополнительные св-ва идёт речь? По-моему в b_user полей с избытком. Можете привести пример?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы