Повторить пользователя на другом сайте
Есть два сайта, сделанных в WP+WooCommerce и страница входа/регистрации на обоих сделана через woocommerce_my_account.
Задача: когда пользователь регистрируется на одном сайте, сразу повторить его на втором с тем же email и passwort.
Можно советы для новичка: за что хвататься сначала, как передать на другой сайт пароль? Можно ли решить задачу просто через WooCommerce-ловушки в настройках WooCommerce?
По РЕСТ можно сразу регистрировать пользователя.
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 }
В функции выбрать данные созданного юзера и отправить запрос создания пользователя на второй сайт. Осталось разобраться с
Доступ: нужна авторизация
Да, логика правильная. Для авторизации, на том сайте куда будет делаться запрос, создай пароль приложения и используй его в этом запросе.
Продолжение вопроса.
После создания юзера на первом сайте событие 'woocommerce_created_customer' запускает функцию, которая отправляет на второй сайт запрос
https://www.site.com/wp-json/wp/v2/users?username=Name&email=Name@gmail.com&password=12345
Запрос срабатывает и пользователь создается, но зайти потом на втором сайте с указанными логином и паролем я не могу.
Вопросы:
- почему, черт побери, юзер создается, а логин говорит, что имя или пароль неверны?
- какое событие происходит на втором сайте при создании юзера таким образом?
- может ли создаться другой пароль?
- как проверить пароль созданного на втором сайте юзера?
Запрос обрабатывает методе 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 объект с данными созданного пользователя.
Что-то ты делаешь не так я полагаю, должен юзер создаваться нормально. Проверь все еще раз, протестируй код запроса на создание где нибудь отдельно.
Ну да, запрос методом POST и в ответ получаю объект с данными и вижу потом, что пользователь создан, но залогиниться не могу.
При создании юзера на первом сайте генерится пароль, я беру этот пароль и вставляю в POST-запрос для создания юзера на втором сайте. У меня не получается посмотреть пароль юзера на втором сайте, чтобы проверить, почему логин ругается.
Точно пароль как обычный текст передаешь а не как-то иначе, проверь все еще раз что связано с паролем. Попробуй простой пароль указать (может где-то символы изменяются, хотя это странно). Звучит это все как баг, но баг там вряд ли есть... Скорее всего ты допускаешь какую-то простую ошибку.
woocommerce_created_customer в массиве new_customer_data в элементе [user_pass] показывает сгенерированный пароль, который приходит в письме и который работает. А функция get_user_by(id, $id) возвращает объект, где в ->user_pass пароль выглядит совершенно иначе. Это на первом сайте.
В запрос создания юзера на втором сайте в password я подставлял и то и другое - по барабану. Юзер на втором сайте создается, но с каким-то другим паролем.
И еще один вопрос: почему не отправляется письмо на mail с извещением о регистрации? Создание юзера через REST не активирует сценарий с письмом?
А вот теперь действительно интересный вопрос: событие rest_insert_user возвращает WP_REST_Request Object. Там есть [GET] => Array с содержимым ([username],[password],[email]) и [POST] => Array, который пуст. При этом [method:protected] => POST.
При этом видно, что password передается такой же, как на первом сайте. Но что же генерится у юзера?
Я что-то не понимаю, но не могу понять что. . Где почитать?
И еще один вопрос: почему не отправляется письмо на mail с извещением о регистрации?
Нет, Чтобы активировать такое письмо нужно добавить такой хук куда нить в код обработки REST запроса или можно прямо в functions.php:
add_action( 'rest_after_insert_user', 'wp_send_new_user_notifications' );
См. wp_new_user_notification()
А вот теперь действительно интересный вопрос
Ты точно POST запросом данные отправляешь на роут реста? Код покажи как ты делаешь REST запрос.
Код покажи как ты делаешь 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 авторизация.
Пользователь создается, это я вижу, только с логином потом как-то странно.
Почему такой странный урл? Если это пост запрос, то проще в body данные передать. Да и оберткой впшной для курла пользоваться удобнее
«artikus»
Может в body и проще, но я знал такой способ и он срабатывает, т.е. создает юзера. После этого происходят события rest_insert_user и rest_after_insert_user. Проблема в том, что потом [woocommerce_my_account] не дает залогиниться с теми mail и password, которые были в запросе. Где нестыковка, я не понимаю.
Попробую разобраться с body.
woocommerce_my_account работает на штатной форме ядра, так что должно штатно происходить. Есть еще момент, а какие вы данные передаете в $crea_user кроме урла?
По идее, а этой переменной долен быть массив с данными нового пользователя, который передается на другой сайт. В общем, не видя полного кода, сложно разобраться в чем проблема
массив с данными нового пользователя
Там передаются username, password и email, не с многоточиями, конечно, а со значениями. Из примеров я понял, что этого достаточно.
$crea_user="https://www.witm.me/wp-json/wp/v2/users?username=...&password=...&email=..."
Для curl данные пост запроса нужно передавать в
curl_setopt_array( $curl, array( ... CURLOPT_POSTFIELDS => array( 'username' => 'kama', ... ), ... ) ); $response = curl_exec( $curl );
Блин, я же написал выше "Для создания запроса используй функцию wp_remote_post()" почему бы не воспользоватся этим советом? К тому же там код стройнее и понятнее получится и в дебаге впешном любом запрос ловится будет. В общем перепиши запрос на wp_remote_post() потом поговорим, если вообще будет еще о чем говорить...
Ок, попробовал функцию wp_remote_post(), передаю параметры для запроса в body. Получаю,
в общем, то же самое. На втором сайте создается юзер, но с другим паролем. Наверно, у меня руки кривые, но я эту гору просто обошел. Пользователь после регистрации получает письма с обоих сайтов и знает оба пароля. Хотелось бы, конечно, понять, почему на втором сайте пароль не берется из параметра, а генерится, но все сроки уже прошли.
В любом случае, спасибо за заинтересованное обсуждение. Узнал много нового.
На втором сайте создается юзер, но с другим паролем
У меня есть версия, что при создании юзера на втором сайте, пароль там автоматом генериться, так как это уже функционал ядра. Может быть имеет смысл слать второй запрос после создания, для перезаписи того пароля. Но это версия, проверять надо
Попробовал на локалке создать юзера таким запросом:
$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', ], ] );
Все работает! С указанными данными авторизуюсь. Непонятно что у тебя было не так, опять наверное плагин како-нибудь шалит...
На втором сайте есть REST API, при регистрации передавайте туда данные по ресту о новом пользователе