Вопрос или проблема
Имеется одно пользовательское поле оформления заказа типа email, которое проверяет, существует ли email на удаленном сервере или нет. Я отправил JSON данные на удаленный сервер с этим полем.
Если email существует, JSON ответ обычно такой:
{
"success": "ok",
"responseCode": "200",
"token": "I0b6uSNelqwGv+sCHpTV6LYI08hxcwoBIMVHh5mKVx+fkRFscUKbvUBF8+rl0vACgMImcffCzLsf571KLQVkSYcvdUfdwsu8mrBQ8mBw5J1LZtFs/7PwXerjNS2HjBAB0tc+RqZhYJ9Ne1efn7fq7Df4kAQ+QO7CjBKUwp8k7pFYslLMcWuxfb+KKsotZP82gkk5oKZEeh30a6K2I7dAxRj+B3RqyqND/uRO1uqQ1IA="
}
Где значение “token” меняется при каждом запросе.
Я хочу сохранить токен как метаданные внутри заказа, после того как проверю, что код ответа = 200.
Использование $order->update_meta_data( 'received_token_key', $token );
не работает само по себе, я знаю, что у меня есть одна большая ошибка, но я не могу её найти.
Может быть, стоит использовать другой хук WooCommerce?
Может быть, использовать wc_session?
Может быть, сохранить в другое место и позже вызвать?
Мне нужно, чтобы перед оформлением заказа email из пользовательского поля был проверен, если нет, wc_add_notice($response_message, 'error');
будет вызвано.
// начинаем здесь
add_action( 'woocommerce_checkout_process', 'custom_checkout_field_process_valid' );
function custom_checkout_field_process_valid($order_id) {
$url="https://remoteserver.com/api/checking-email-registered-user.json";
$body = array("email"=>($_POST['email_pasajero']),); //из пользовательского поля
$response2 = wp_remote_post( $url,
array(
'headers' => array('Content-Type' => 'application/json; charset=utf-8'),
'method' => 'POST',
'timeout' => 75,
'body' => json_encode($body),));
// проверяем и используем ответ
$response_code = wp_remote_retrieve_response_code( $response2 );
$response_message = wp_remote_retrieve_response_message( $response2 );
$bodyarray = json_decode( wp_remote_retrieve_body( $response2 ));
$token = $bodyarray["token"];
if ($response_code == 200) {
// Я хочу сохранить $token или его значение, на этом шаге, как метаданные для дальнейшего использования
// может быть, прямо из ответа?
// $order->update_meta_data( 'token_received_key', $token ); не работает
}
else {
wc_add_notice($response_message, 'error');
return $response_code ;
}
}
Вы очень близки.
$order->update_meta_data()
будет обновлять мета-значение внутри объекта $order
, но не будет сохранять изменения в базе данных. Чтобы сохранить изменения в объекте WooCommerce CRUD, вам нужно вызвать метод save()
:
if ( $response_code == 200 ) {
$order->update_meta_data( 'token_received_key', $token );
$order->save();
}
Ответ или решение
Как сохранить один ответ API в метаданных заказа WooCommerce
В рамках разработки электронной коммерции и интеграции сторонних сервисов для WooCommerce, возникает необходимость сохранить определённые данные, полученные от удалённых серверов, в метаданных заказов. В вашем случае, требуется сохранить токен, получаемый в ответе на запрос валидации email, в метаданные заказа, если код ответа равен 200.
Процесс реализации
Для достижения данной цели, необходимо правильно обработать ответ API и сохранить необходимые данные. Рассмотрим последовательность действий, которая поможет решить вашу задачу.
-
Проверка кода ответа: Во время обработки валидации email, вам необходимо отправить запрос на удалённый сервер и проверить код ответа.
-
Получение токена: Если код ответа равен 200, проверьте, что токен был успешно получен.
-
Сохранение токена в метаданные заказа: Чтобы сохранить полученный токен в метаданные заказа, воспользуйтесь методом
update_meta_data
объекта заказа, а затем вызовите методsave
, чтобы обновить данные в базе.
Пример кода
Давайте рассмотрим ваш код с необходимыми доработками для успешного выполнения поставленной задачи:
add_action('woocommerce_checkout_process', 'custom_checkout_field_process_valid');
function custom_checkout_field_process_valid($order_id) {
// Убедитесь в том, что заказы могут быть обработаны, если у вас включена функция обработки заказа.
if (isset($_POST['email_pasajero'])) {
$url = "https://remoteserver.com/api/checking-email-registered-user.json";
$body = array("email" => sanitize_email($_POST['email_pasajero']));
// Отправка запроса
$response2 = wp_remote_post($url, array(
'headers' => array('Content-Type' => 'application/json; charset=utf-8'),
'method' => 'POST',
'timeout' => 75,
'body' => json_encode($body),
));
// Обработка ответа
$response_code = wp_remote_retrieve_response_code($response2);
$response_message = wp_remote_retrieve_response_message($response2);
$bodyarray = json_decode(wp_remote_retrieve_body($response2), true);
if ($response_code == 200 && !empty($bodyarray["token"])) {
$token = $bodyarray["token"];
// Получаем объект заказа для обновления метаданных
$order = wc_get_order($order_id);
$order->update_meta_data('token_received_key', $token);
$order->save(); // Сохраняем изменения в базе данных
} else {
// Если код ответа не 200, выводим сообщение об ошибке
wc_add_notice($response_message, 'error');
return;
}
}
}
Объяснение кода
- Проверка наличия email: Перед тем как выполнить запрос, убедитесь, что поле email действительно заполнено.
- Отправка запроса: Используется
wp_remote_post
для отправки POST-запроса на указанный URL с email в теле запроса. - Обработка ответа: Код проверяет, равен ли код ответа 200 и не пуст ли токен в ответе. Если токен получен и код ответа положительный, он сохраняется в метаданных заказа.
- Сохранение изменений:
save()
метод применен к объекту заказа для обеспечения сохранения изменений в базе данных WooCommerce.
Заключение
Таким образом, при корректной реализации вышеописанного кода, вы сможете успешно сохранить токен из API-ответа в метаданные заказа WooCommerce. Это решение не только обеспечит сохранность необходимой информации, но и повысит уровень взаимодействия вашего сайта с внешними сервисами. Оптимизированный процесс проверки email и сохранения токена гарантирует, что только корректные данные попадут в систему, способствуя улучшению пользовательского опыта.
Используйте этот подход для интеграции сторонних API в ваши WooCommerce-проекты, и вы значительно улучшите функционал вашего интернет-магазина.