Вопрос или проблема
У меня есть форма на моем сайте, и в зависимости от того, отмечает ли пользователь PayPal или банковский перевод, действие формы всегда должно переходить на functions.php, где у меня есть эта простая проверка в конце файла:
if ( isset( $_POST['submitted'] ) && isset( $_POST['post_nonce_field'] ) && wp_verify_nonce( $_POST['post_nonce_field'], 'post_nonce' ) ) {
// КОД ПОСЛЕ ОТПРАВКИ ЗДЕСЬ
}
Так что, мой вопрос заключается в том, как мне выполнить некоторые действия с помощью условия if в my functions.php перед отправкой формы в PayPal?
Потому что все уроки имеют действие формы https://www.sandbox.paypal.com/cgi-bin/webscr
Как я мог бы отправить всю информацию поста из формы (я могу получить значения и сохранить их в переменных) по этому адресу https://www.sandbox.paypal.com/cgi-bin/webscr
?
Можно ли как-то сделать это и не использовать форму для отправки значений туда?
Есть ли у WordPress какая-либо функция для отправки POST-запроса на удаленный URL?
Это на самом деле не проблема WordPress, и, вероятно, получит лучший ответ на странице Stack Overflow по PayPal:
https://stackoverflow.com/questions/tagged/paypal
Тем не менее, судя по тому, что я понял из вашего вопроса, вы хотите знать, как передать значения из вашей формы в PayPal?
Для этого вам нужно заполнить скрытые поля и ‘отправить’ их на адрес PayPal, используя метод POST формы.
Следующая ссылка должна помочь вам:
https://www.paypal.com/cgi-bin/webscr?cmd=p/pdn/howto_checkout-outside#methodtwo
Если это не то, что вы ищете, сообщите нам, какие условия вы хотите проверить в вашем файле функций, и мы сможем помочь вам дальше.
Прежде всего, переместите этот код из конца вашего файла functions.php
в функцию, которая подключается к wp_init
(по-прежнему внутри functions.php). Проверьте наличие nonce / отправку формы в этой функции. Это почти то же самое (я думаю, что файлы functions.php
темы загружаются в wp_init
), но это определенно более “вордпрессный” способ делать вещи, и он менее склонен уничтожить ваш сайт в будущем.
После этого вам придется использовать curl или класс PayPal, который обертывает необходимый curl. Без этого никак не обойтись, и это выходит за рамки WordPress. Если вам нужна дополнительная помощь с этим, я бы рекомендовал задать еще один вопрос на обычном Stackoverflow.
Существует несколько способов подойти к этому:
Метод cURL
Отправьте через cURL, отправив вашу форму на <form action"<?php echo get_template_url; ?>/form_processors.php" method="POST">
В этом файле вы бы очистили вводимые данные и сделали ваш вызов cURL, отправив его через POST. Вы также можете использовать wp_remote_post() здесь, что будет более надежным на серверах, на которых может не быть установлен cURL, если это является проблемой.
Метод AJAX
Эта статья должна покрыть то, что вы пытаетесь сделать на стороне PayPal, и должна быть достаточно простой для изменения для опции банковского перевода.
http://code.tutsplus.com/tutorials/a-guide-to-the-wordpress-http-api-payments-with-paypal–wp-25137
Ответ или решение
Чтобы отправить значения формы с помощью скрипта в файле functions.php
вашего сайта, а не напрямую через форму, вы можете использовать несколько подходов. Давайте рассмотрим, как это сделать, и приведем примеры кода.
Шаг 1: Создание формы с использованием JavaScript
Сначала создайте вашу форму в HTML и добавьте обработчик события на кнопке отправки, чтобы предотвратить стандартное поведение отправки формы. Вместо этого, вы будете отправлять данные через AJAX.
<form id="paymentForm" method="post">
<input type="hidden" name="submitted" value="1">
<input type="hidden" name="post_nonce_field" value="<?php echo wp_create_nonce('post_nonce'); ?>">
<!-- Другие поля формы -->
<div>
<label for="paymentMethod">Способ оплаты:</label>
<select name="paymentMethod" id="paymentMethod">
<option value="paypal">PayPal</option>
<option value="wire-transfer">Банковский перевод</option>
</select>
</div>
<button type="submit">Оплатить</button>
</form>
<script>
document.getElementById("paymentForm").addEventListener("submit", function(event) {
event.preventDefault(); // предотвращаем стандартное поведение
var formData = new FormData(this); // собираем данные формы
fetch('/wp-admin/admin-ajax.php?action=process_payment', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
// Обрабатываем ответ от сервера
console.log(data);
})
.catch(error => console.error('Ошибка:', error));
});
</script>
Шаг 2: Обработка AJAX-запроса в functions.php
Теперь мы добавим обработчик AJAX-запросов в файл functions.php
. Этот обработчик будет проверять полученные данные, а затем делать запрос к PayPal или выполнять другие действия.
add_action('wp_ajax_process_payment', 'process_payment');
add_action('wp_ajax_nopriv_process_payment', 'process_payment');
function process_payment() {
// Проверка nonce
if (isset($_POST['submitted']) && isset($_POST['post_nonce_field']) && wp_verify_nonce($_POST['post_nonce_field'], 'post_nonce')) {
// Получаем данные из формы
$payment_method = isset($_POST['paymentMethod']) ? sanitize_text_field($_POST['paymentMethod']) : '';
// Пример условия для обработки PayPal или банковского перевода
if ($payment_method === 'paypal') {
// Ваш код работы с PayPal
$response = wp_remote_post('https://www.sandbox.paypal.com/cgi-bin/webscr', array(
'body' => array(
// ваш PayPal-код
)
));
// Обработка ответа от PayPal
if (is_wp_error($response)) {
wp_send_json_error('Ошибка соединения с PayPal');
} else {
wp_send_json_success('Успешная оплата через PayPal');
}
} elseif ($payment_method === 'wire-transfer') {
// Ваш код для банковского перевода
wp_send_json_success('Банковский перевод выбран');
} else {
wp_send_json_error('Неизвестный способ оплаты');
}
} else {
wp_send_json_error('Проблема с nonce');
}
wp_die(); // завершение AJAX-запроса
}
Заключение
Используя описанный выше метод, вы сможете динамически отправлять данные формы в зависимости от выбранного способа оплаты и обрабатывать их в functions.php
. Вы также можете дополнительно добавлять логику для обработки ответов от PayPal или других систем платежей.
Этот способ интеграции обеспечивает повышенную безопасность и контроль, поскольку вы проверяете значения перед отправкой. Вместо прямой отправки данных на сторонние сайты, вы можете обрабатывать их и принимать решения непосредственно на вашем сервере. Использование AJAX добавляет современный подход к взаимодействию с пользователем, улучшая его опыт.
Не забудьте протестировать вашу реализацию в тестовой среде, прежде чем разворачивать её на живом сайте.