Повторить пользователя на другом сайте

Есть два сайта, сделанных в WP+WooCommerce и страница входа/регистрации на обоих сделана через woocommerce_my_account.

Задача: когда пользователь регистрируется на одном сайте, сразу повторить его на втором с тем же email и passwort.

Можно советы для новичка: за что хвататься сначала, как передать на другой сайт пароль? Можно ли решить задачу просто через WooCommerce-ловушки в настройках WooCommerce?

Заметки к вопросу:
artikus 3.2 года назад

На втором сайте есть REST API, при регистрации передавайте туда данные по ресту о новом пользователе

Kama 3.2 года назад

По РЕСТ можно сразу регистрировать пользователя.

Chechako 3.2 года назад

Kama сегодня
По РЕСТ можно сразу регистрировать пользователя.

Т.е. вставить в functions.php реакцию на событие и функцию:

add_action('register_new_user', 'action_function_user_transmit' );
function action_function_user_transmit( $user_id ){
	// Делаем что-либо...
	$ curl -X POST -i http://example.com/wp-json/wp/v2/users?username=neuser&email=asd@asd.ru&password=123456
}

В функции выбрать данные созданного юзера и отправить запрос создания пользователя на второй сайт. Осталось разобраться с

Доступ: нужна авторизация

smile

Kama 3.2 года назад

Да, логика правильная. Для авторизации, на том сайте куда будет делаться запрос, создай пароль приложения и используй его в этом запросе.

Chechako 3.1 год назад

Продолжение вопроса.
После создания юзера на первом сайте событие 'woocommerce_created_customer' запускает функцию, которая отправляет на второй сайт запрос
https://www.site.com/wp-json/wp/v2/users?username=Name&email=Name@gmail.com&password=12345
Запрос срабатывает и пользователь создается, но зайти потом на втором сайте с указанными логином и паролем я не могу.
Вопросы:

  • почему, черт побери, юзер создается, а логин говорит, что имя или пароль неверны? smile
  • какое событие происходит на втором сайте при создании юзера таким образом?
  • может ли создаться другой пароль?
  • как проверить пароль созданного на втором сайте юзера?
Kama 3.1 год назад

Запрос обрабатывает методе WP_REST_Users_Controller::create_item() в ядре которого срабатывает функция wp_create_user().

Запрос нужно отправлять методом POST

$ curl -X POST -i http://example.com/wp-json/wp/v2/users?username=neuser&email=asd@asd.ru&password=123456

Для создания запроса используй функцию wp_remote_post()

В ответ должен вернутся JSON объект с данными созданного пользователя.

Что-то ты делаешь не так я полагаю, должен юзер создаваться нормально. Проверь все еще раз, протестируй код запроса на создание где нибудь отдельно.

Chechako 3.1 год назад

Ну да, запрос методом POST и в ответ получаю объект с данными и вижу потом, что пользователь создан, но залогиниться не могу.

При создании юзера на первом сайте генерится пароль, я беру этот пароль и вставляю в POST-запрос для создания юзера на втором сайте. У меня не получается посмотреть пароль юзера на втором сайте, чтобы проверить, почему логин ругается.

Kama 3.1 год назад

Точно пароль как обычный текст передаешь а не как-то иначе, проверь все еще раз что связано с паролем. Попробуй простой пароль указать (может где-то символы изменяются, хотя это странно). Звучит это все как баг, но баг там вряд ли есть... Скорее всего ты допускаешь какую-то простую ошибку.

Chechako 3.1 год назад

woocommerce_created_customer в массиве new_customer_data в элементе [user_pass] показывает сгенерированный пароль, который приходит в письме и который работает. А функция get_user_by(id, $id) возвращает объект, где в ->user_pass пароль выглядит совершенно иначе. Это на первом сайте.
В запрос создания юзера на втором сайте в password я подставлял и то и другое - по барабану. Юзер на втором сайте создается, но с каким-то другим паролем.

Chechako 3.1 год назад

И еще один вопрос: почему не отправляется письмо на mail с извещением о регистрации? Создание юзера через REST не активирует сценарий с письмом?

Chechako 3.1 год назад

А вот теперь действительно интересный вопрос: событие rest_insert_user возвращает WP_REST_Request Object. Там есть [GET] => Array с содержимым ([username],[password],[email]) и [POST] => Array, который пуст. При этом [method:protected] => POST.
При этом видно, что password передается такой же, как на первом сайте. Но что же генерится у юзера?
Я что-то не понимаю, но не могу понять что. smile. Где почитать?

Kama 3.1 год назад

И еще один вопрос: почему не отправляется письмо на mail с извещением о регистрации?

Нет, Чтобы активировать такое письмо нужно добавить такой хук куда нить в код обработки REST запроса или можно прямо в functions.php:

add_action( 'rest_after_insert_user', 'wp_send_new_user_notifications' );

См. wp_new_user_notification()

А вот теперь действительно интересный вопрос

Ты точно POST запросом данные отправляешь на роут реста? Код покажи как ты делаешь REST запрос.

Chechako 3.1 год назад

Код покажи как ты делаешь REST запрос.

$crea_user="https://www.witm.me/wp-json/wp/v2/users?username=...&password=...&email=..."
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $crea_user);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$output = curl_exec($ch);
curl_close($ch);

В $headers авторизация.
Пользователь создается, это я вижу, только с логином потом как-то странно.

artikus 3.1 год назад

Почему такой странный урл? Если это пост запрос, то проще в body данные передать. Да и оберткой впшной для курла пользоваться удобнее

Chechako 3.1 год назад

«artikus»

Может в body и проще, но я знал такой способ и он срабатывает, т.е. создает юзера. После этого происходят события rest_insert_user и rest_after_insert_user. Проблема в том, что потом [woocommerce_my_account] не дает залогиниться с теми mail и password, которые были в запросе. Где нестыковка, я не понимаю.
Попробую разобраться с body.

artikus 3.1 год назад

woocommerce_my_account работает на штатной форме ядра, так что должно штатно происходить. Есть еще момент, а какие вы данные передаете в $crea_user кроме урла?

artikus 3.1 год назад

По идее, а этой переменной долен быть массив с данными нового пользователя, который передается на другой сайт. В общем, не видя полного кода, сложно разобраться в чем проблема

Chechako 3.1 год назад

массив с данными нового пользователя

Там передаются username, password и email, не с многоточиями, конечно, а со значениями. Из примеров я понял, что этого достаточно.
$crea_user="https://www.witm.me/wp-json/wp/v2/users?username=...&password=...&email=..."

Kama 3.1 год назад

Для curl данные пост запроса нужно передавать в

curl_setopt_array( $curl, array(
	...
	CURLOPT_POSTFIELDS => array( 'username' => 'kama', ... ),
	...
) );

$response = curl_exec( $curl );

Блин, я же написал выше "Для создания запроса используй функцию wp_remote_post()" почему бы не воспользоватся этим советом? К тому же там код стройнее и понятнее получится и в дебаге впешном любом запрос ловится будет. В общем перепиши запрос на wp_remote_post() потом поговорим, если вообще будет еще о чем говорить...

Chechako 3.1 год назад

Ок, попробовал функцию wp_remote_post(), передаю параметры для запроса в body. Получаю,
в общем, то же самое. На втором сайте создается юзер, но с другим паролем. Наверно, у меня руки кривые, но я эту гору просто обошел. Пользователь после регистрации получает письма с обоих сайтов и знает оба пароля. Хотелось бы, конечно, понять, почему на втором сайте пароль не берется из параметра, а генерится, но все сроки уже прошли. smile
В любом случае, спасибо за заинтересованное обсуждение. Узнал много нового.

artikus 3.1 год назад

На втором сайте создается юзер, но с другим паролем

У меня есть версия, что при создании юзера на втором сайте, пароль там автоматом генериться, так как это уже функционал ядра. Может быть имеет смысл слать второй запрос после создания, для перезаписи того пароля. Но это версия, проверять надо

Kama 3.1 год назад

Попробовал на локалке создать юзера таким запросом:

$res = wp_remote_post( 'https://wp-kama.dev/api/wp/v2/users', [
	'headers' => [
		'Authorization' => 'Basic a21RyBYVjJzIE5a2RVBWjQFtYTpg5W5uSTIYTRVIFUgeaw==',
	],
	'body'    => [
		'username' => 'testets2',
		'email' => 'test@test.ts1',
		'password' => 'test123',
	],
] );

Все работает! С указанными данными авторизуюсь. Непонятно что у тебя было не так, опять наверное плагин како-нибудь шалит...