Problema con wp_remote_post enviando datos a una API externa en el registro de usuarios
Estoy intentando crear un plugin básico para enviar detalles del usuario a un CRM cuando un usuario se registra en el sitio WordPress como suscriptor básico.
He llegado a un punto muerto, he tratado de interpretar los detalles de la API lo mejor que puedo, pero no estoy seguro si estoy formateando mis datos del body correctamente ya que simplemente no funciona.
Puedo hacer que el POST funcione usando Postman, sin embargo, eso es a través de json/javascript y en el sitio estoy tratando de lograr el mismo resultado usando wp_remote_post
.
Cualquier sugerencia u observación sería apreciada.
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);
};

Recomiendo configurar solo los argumentos que realmente necesites cambiar de los valores predeterminados, para eliminar posibles problemas durante las pruebas. Lo mejor es agregar argumentos adicionales solo cuando sean necesarios.
Todos los argumentos se pueden encontrar aquí: https://developer.wordpress.org/reference/classes/WP_Http/request/
Si es posible, también elimina la autenticación requerida al principio para probar solo el POST antes de agregar seguridad/autenticación.
Tampoco necesitas cerrar una función con un punto y coma ;
Recomiendo buscar cómo configurar xdebug para depurar tu código localmente. Si no puedes hacer eso, entonces recomiendo usar error_log
para registrar en el registro de errores de tu proveedor de alojamiento, para que puedas ver cuál es la respuesta.
También configuraste blocking
en false, ¿no deseas una respuesta del servidor?
// Si este archivo es llamado directamente, abortar.
if ( ! defined( 'WPINC' ) ) {
die;
}
// Encontrar los detalles de un nuevo usuario
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;
// obtener todos los metadatos del usuario recién registrado
$new_user_data = get_user_meta($user_id);
// obtener el nombre del usuario como una cadena
$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( '¡No se puede obtener userdata!' );
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 );
}

Gracias sMyles, ahora he logrado activar el registro de errores, lo que significa que puedo depurar mejor. Todavía no funciona, pero al menos está imprimiendo la respuesta, lo que me permite analizarla. Parece que intentar crear el 'party' está impidiendo el envío.

He logrado enviar los datos si paso información absoluta. Ahora que estoy intentando recuperar y enviar datos dinámicos, mi registro de errores se está llenando con '¡No se pueden obtener los datos del usuario!', por lo que obviamente la declaración if está fallando. ¿Necesito hacer algo más aparte de lo que está en el código del plugin que aparece abajo para recuperar los datos del objeto $user después de que se crea un nuevo usuario? **He actualizado el bloque de código original en la pregunta, pero está siendo revisado por pares

@DanSutherland puedes intentar cambiar get_userdata
por get_user_by( 'id', $user_id );
(ya que get_userdata
es solo un envoltorio) ... pero también es una función pluggable, así que dependiendo de lo que tengas en tu sitio, es posible que algo esté sobrescribiendo esa llamada a la función --- si estás viendo Unable to get userdata
significa que esa función está devolviendo false en lugar de los datos del usuario
