WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

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

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

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

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

Заметки к вопросу:
artikus 1 месяц назад

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

Kama 1 месяц назад

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

Chechako 1 месяц назад

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

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

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

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

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

smile

Kama 1 месяц назад

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

Chechako 1 месяц назад

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

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

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

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

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

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

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

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

Chechako 1 месяц назад

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

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

Kama 1 месяц назад

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

Chechako 1 месяц назад

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

Chechako 1 месяц назад

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

Chechako 1 месяц назад

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

Kama 1 месяц назад

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

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

add_action( 'rest_after_insert_user', 'wp_send_new_user_notifications' );

См. wp_new_user_notification()

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

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

Chechako 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 1 месяц назад

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

Chechako 1 месяц назад

«artikus»

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

artikus 1 месяц назад

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

artikus 1 месяц назад

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

Chechako 1 месяц назад

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

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

Kama 1 месяц назад

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

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

$response = curl_exec( $curl );

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

Chechako 1 месяц назад

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

artikus 1 месяц назад

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

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

Kama 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',
	],
] );

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

0
Chechako
1 месяц назад

Нет ответов на этот вопрос.

    На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация