Problemi con wp_remote_post nell'invio dati a un'API esterna durante la registrazione utente
Sto cercando di creare un plugin base per inviare i dettagli dell'utente a un CRM quando un utente si registra sul sito WordPress come semplice subscriber.
Sono arrivato a un punto critico: ho cercato di interpretare al meglio i dettagli dell'API, ma non sono sicuro se sto formattando correttamente i dati del body poiché semplicemente non funziona.
Riesco a far funzionare la richiesta POST usando Postman, tuttavia quella è via json/javascript mentre sul sito sto cercando di ottenere lo stesso risultato usando wp_remote_post
.
Qualsiasi suggerimento od osservazione sarebbe apprezzato.
// Aggiungi azione quando un nuovo utente si registra
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);
};

Consiglio di impostare solo gli argomenti che è assolutamente necessario modificare rispetto ai valori predefiniti, per evitare potenziali problemi durante i test. È meglio aggiungere ulteriori argomenti solo quando sono necessari.
Tutti gli argomenti possono essere trovati qui: https://developer.wordpress.org/reference/classes/WP_Http/request/
Se possibile, rimuovi anche l'autenticazione richiesta inizialmente per testare solo il POST prima di aggiungere la sicurezza/autenticazione.
Inoltre, non è necessario chiudere una funzione con un punto e virgola ;
Consiglio di cercare come configurare xdebug per poter eseguire il debug del codice localmente. Se non puoi farlo, allora consiglio di usare error_log
per registrare nel log degli errori del tuo provider di hosting, così puoi vedere qual è la risposta.
Hai anche impostato blocking
su false, non vuoi una risposta dal server?
// Se il file viene chiamato direttamente, interrompi.
if ( ! defined( 'WPINC' ) ) {
die;
}
// Trova i dettagli di un nuovo utente
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;
// ottieni tutti i metadati del nuovo utente registrato
$new_user_data = get_user_meta($user_id);
// ottieni il nome dell'utente come stringa
$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( 'Impossibile ottenere i dati utente!' );
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 );
}

Grazie sMyles, ora sono riuscito ad attivare la registrazione degli errori, il che mi permette di debugare meglio. Ancora non funziona, ma almeno stampa la risposta che posso analizzare. Sembra che il tentativo di creare il 'party' stia bloccando l'invio.

Sono riuscito a far passare i dati se inserisco valori assoluti. Ora che sto provando a recuperare e inviare dati dinamici, il mio log degli errori si riempie con 'Unable to get userdata!' quindi chiaramente l'istruzione if sta fallendo. Devo fare qualcosa oltre a quanto presente nel codice del plugin qui sotto per recuperare i dati dell'oggetto $user dopo la creazione di un nuovo utente **Ho aggiornato il blocco di codice originale nella domanda ma è in fase di revisione tra pari

@DanSutherland puoi provare a cambiare get_userdata
con get_user_by( 'id', $user_id );
(poiché get_userdata
è solo un wrapper) ... ma è anche una funzione pluggable, quindi a seconda di cosa hai sul tuo sito è possibile che qualcosa stia sovrascrivendo quella chiamata di funzione --- se vedi Unable to get userdata
significa che la funzione sta restituendo false invece dei dati utente
