Проблема с wp_remote_post при отправке данных во внешний API при регистрации пользователя
Я пытаюсь создать простой плагин для отправки данных пользователя в CRM, когда пользователь регистрируется на WordPress сайте как обычный подписчик.
Я столкнулся с проблемой: я попытался интерпретировать детали API как можно лучше, но я не уверен, правильно ли я форматирую данные в теле запроса, так как это просто не работает.
Я могу добиться работы POST-запроса используя Postman, однако это через json/javascript, а на сайте я пытаюсь достичь того же результата, используя wp_remote_post
.
Буду признателен за любые подсказки или замечания.
add_action( 'user_register', 'send_new_user', 10, 1 );
function send_new_user($user_id) {
// Получаем данные нового пользователя
$new_user = get_userdata($user_id);
$useremail = $new_user -> user_email;
$url = 'https://api.capsulecrm.com/api/v2/parties';
$body = array(
'firstName' => 'WhyWontYouWork',
'email' => $useremail
);
$args = array(
'method' => 'POST',
'timeout' => 45,
'redirection' => 5,
'httpversion' => '1.0',
'sslverify' => false,
'blocking' => false,
'headers' => array(
'Authorization' => 'Bearer {private token goes here!!!!}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
),
'body' => json_encode($body),
'cookies' => array()
);
$request = wp_remote_post ($url, $args);
};

Рекомендую устанавливать только те аргументы, которые действительно необходимо изменить по умолчанию, чтобы избежать потенциальных проблем при тестировании. Лучше добавлять дополнительные аргументы только по мере необходимости.
Все аргументы можно найти здесь: https://developer.wordpress.org/reference/classes/WP_Http/request/
По возможности также сначала удалите обязательную аутентификацию, чтобы просто протестировать POST перед добавлением безопасности/аутентификации.
Также не нужно закрывать функцию точкой с запятой ;
Рекомендую изучить, как настроить xdebug для локальной отладки кода. Если это невозможно, советую использовать error_log
для записи в лог ошибок вашего хостинг-провайдера, чтобы видеть ответ сервера.
Вы также установили blocking
в false - разве вам не нужен ответ от сервера?
// Если файл вызван напрямую, прерываем выполнение
if ( ! defined( 'WPINC' ) ) {
die;
}
// Находим данные нового пользователя
add_action('user_register', 'send_doqaru_user', 10, 1);
function send_doqaru_user ($user_id){
$new_doqaru_user = get_userdata($user_id);
$doqaru_user_email = $new_doqaru_user -> user_email;
// получаем все метаданные нового зарегистрированного пользователя
$new_user_data = get_user_meta($user_id);
// получаем имя пользователя в виде строки
$doqaru_user_firstname = get_user_meta( $user_id, 'first_name', true );
$doqaru_user_lastname = get_user_meta( $user_id, 'last_name', true );
if( ! $new_user ){
error_log( 'Не удалось получить данные пользователя!' );
return;
}
$url = 'https://api.capsulecrm.com/api/v2/parties';
$body = array(
'type' => 'person',
'firstName' => $doqaru_user_firstname,
'lastName' => $doqaru_user_lastname,
'emailAddresses' => array(
'type' => 'Work',
'address' => $new_user->user_email
));
$args = array(
'method' => 'POST',
'timeout' => 45,
'sslverify' => false,
'headers' => array(
'Authorization' => 'Bearer {token goes here}',
'Content-Type' => 'application/json',
),
'body' => json_encode($body),
);
$request = wp_remote_post( $url, $args );
if ( is_wp_error( $request ) || wp_remote_retrieve_response_code( $request ) != 200 ) {
error_log( print_r( $request, true ) );
}
$response = wp_remote_retrieve_body( $request );
}

Спасибо, sMyles! Теперь мне удалось настроить логирование ошибок, что позволяет лучше отлаживать код. Пока что всё ещё не работает, но по крайней мере выводится ответ, который я могу разобрать. Похоже, что попытка создать 'party' мешает отправке данных.

Мне удалось передать данные, если я использую абсолютные значения. Теперь, когда я пытаюсь получить и отправить динамические данные, в логе ошибок появляется сообщение 'Unable to get userdata!', так что условие if явно не выполняется. Нужно ли мне делать что-то ещё, кроме того, что есть в коде плагина ниже, чтобы получить данные объекта $user после создания нового пользователя? **Я обновил исходный блок кода в вопросе, но он проходит проверку сообществом.

@DanSutherland, попробуйте заменить get_userdata
на get_user_by( 'id', $user_id );
(поскольку get_userdata
— это просто обёртка) ... но это также плагируемая функция, поэтому в зависимости от того, что есть на вашем сайте, возможно, что-то переопределяет этот вызов функции --- если вы видите Unable to get userdata
, это означает, что функция возвращает false вместо данных пользователя.
