Вопрос или проблема
В: Как правильно вызвать функцию PHP с несколькими параметрами из AJAX-обработчика?
В: Я правильно вызываю функцию php?
В: Есть ли более простой способ сделать это?
Элемент страницы
Пользователь нажимает кнопку.
Действие:
Нажатие вызовет код php для подключения к внешнему серверу с использованием следующих параметров:
- Имя пользователя 2. IP-адрес 3. Порт 4. Открытый ключ 5. Сервис
Цель:
Отправить строку голосования (с хоста A) на внешний игровой сервер (хост B).
Мне не нужно обновлять какой-либо контент WordPress. Примечание: Я владелец обоих серверов.
WordPress Версия: 5.4.1 Версия PHP на сервере 7.3
Изначально у меня был мой пользовательский код php в отдельном файле “/wp-contents/plugins/my-plugin/votifier.php”. Я пытался вызывать свои функции в этом файле из AJAX-обработчика.
- MyPlugin.php
- sendvote.js
- votifier.php (Я в конечном итоге переместил код из этого файла в 1.MyPlugin.php выше)
Я убедился, что пользовательский плагин активирован.
У меня WordPress в режиме отладки. т.е. Режим отладки включен.
Кнопка
<div id="frm_field_61_container">
<button type="button">Попробовать</button>
</div>
WordPress JQuery с AJAX (sendvote.js)
ПРИМЕЧАНИЕ: Этот код находится в отдельном файле в папке моих плагинов.
Имя файла sendvote.js
jQuery(document).ready( function($) {
$("#frm_field_61_container").click(function(){
// e.preventDefault(); // используется для отмены действия отправки форм.
jQuery.ajax({
url : myAjax.ajaxurl,
type : 'POST',
dataType : 'json',
data : {
'action' :'my_vote_count'
,'username' :$.trim($('#field_9gma9').val())
,'key' :$.trim($('#field_yjr62').val())
,'ip' :$.trim($('#field_973sr').val())
,'port' :$.trim($('#field_q9ajo').val())
,'service' :'Votifier'
,'nonce' :'votifier_nonce_key'
},
success: function(data) {
console.log(data);
},
error: function(errorThrown){
console.log(errorThrown);
}
});
});
});
/* ===== WP_ENQUEUE SCRIPTS ==== */
ПРИМЕЧАНИЕ: Этот код находится в отдельном файле с именем MyPlugin.php.
add_action( 'wp_enqueue_scripts', 'my_script_enqueuer' );
function my_script_enqueuer() {
wp_enqueue_script( 'my_voter_script', plugins_url('sendvote.js', __FILE__), array( 'jquery'),'1.0', true);
wp_localize_script( 'my_voter_script', 'myAjax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' )));
}
/* ===== Мой AJAX-обработчик ==== */
ПРИМЕЧАНИЕ: Этот код также находится в файле “MyPlugin.php”.
add_action( 'wp_ajax_nopriv_my_vote_count', 'my_ajax_handler' );
add_action( 'wp_ajax_my_vote_count', 'my_ajax_handler');
function my_ajax_handler() {
//check_ajax_referer('votifier_nonce_key');
$user = (isset($_POST['username'])) ? $_POST['username'] : 'Отсутствует пользователь';
$key = (isset($_POST['key'])) ? $_POST['key'] : 'Отсутствует ключ';
$ip = (isset($_POST['ip'])) ? $_POST['ip'] : 'Отсутствует IP-адрес';
$port = (isset($_POST['port'])) ? $_POST['port'] : 25566;
$service = (isset($_POST['service'])) ? $_POST['service'] : 'Отсутствует сервис';
define( 'PUBLIC_KEY_FORMAT', "-----BEGIN PUBLIC KEY-----\n%s\n-----END PUBLIC KEY-----" );
/* XXXX Пользовательский код здесь XXXX */
// Функция sendVote() была в отдельном файле.
// Файл votifier.php содержал функцию sendVote().
// примечание: Функции работали хорошо вне WordPress
// т.е. Я полностью тестировал их перед попыткой вызвать функцию отсюда.
// Я сдался и просто
// поместил весь PHP-код сюда и удалил все функции.
// Я удалил -- echo sendVote($p1,$p2,$p3,$p4,$p5); -- из этой области.
// Когда я это сделал, всё начало работать.
// Я знаю, что функции WordPress работают здесь.
// Почему я не могу вызвать свою собственную пользовательскую функцию из отдельного php-файла?
// Нужно ли мне добавить операцию include?
wp_send_json_success($user . $fkey . $ip . $port . $service . $crypted);
wp_die(); // Все обработчики ajax завершат работу, когда закончат
}
Теперь всё работает
Один из ответов …
поместите весь PHP-код в AJAX-обработчик, вместо того чтобы пытаться вызвать внешнюю PHP-функцию.
Извините за поздний ответ. Сначала разрешите POST-запросы из вашего WordPress на ваш игровой сервер (с помощью Apache или PHP или любого другого метода).
Затем в вашей функции AJAX-обработчика используйте wp_remote_post
, чтобы POST-ить ваши данные на игровой сервер.
$request = wp_remote_post( 'https://urltoyour/gameserver/voting/endpoint', array(
'body' => $body, // данные голосования в формате массива/json
) );
$response = wp_remote_retrieve_body( $request );
Для более подробной информации, пожалуйста, ознакомьтесь с HTTP API WordPress.
Ответ или решение
Вопрос: Как правильно вызвать функцию PHP с несколькими параметрами из обработчика AJAX?
При работе с AJAX в WordPress, существует несколько нюансов, которые важно учитывать, особенно когда речь идет о передаче данных между JavaScript и PHP. В вашем случае, цель — вызвать функцию PHP с несколькими параметрами, чтобы отправить голос через AJAX. Давайте разберем это по шагам.
Описание проблемы
Пользователь нажимает кнопку, активирует AJAX-запрос и передает несколько параметров (имя пользователя, IP адрес, порт, публичный ключ и сервис) в функцию PHP. Изначально вы пытались поместить вашу функцию в отдельный файл votifier.php
, но столкнулись с проблемами при вызове этой функции в обработчике AJAX.
Решение проблемы
-
Подключение вашего файла функций (если необходимо):
Если вы все еще хотите оставить свою функцию в отдельном файле, убедитесь, что он правильно подключен. Например, вы можете использоватьinclude
илиrequire
в вашем файлеMyPlugin.php
для загрузки функций изvotifier.php
:include_once plugin_dir_path(__FILE__) . 'votifier.php';
Это позволит вам вызывать функции из
votifier.php
в вашем AJAX обработчике. -
Передача параметров:
Как вы уже делаете, вы передаете параметры через AJAX. Это правильный подход. Убедитесь, что вы правильно инициализируете их в обработчике AJAX:function my_ajax_handler() { // ПроверкаNonce для безопасности check_ajax_referer('votifier_nonce_key', 'nonce'); // Получение данных из POST запроса $user = $_POST['username']; $key = $_POST['key']; $ip = $_POST['ip']; $port = $_POST['port']; $service = $_POST['service']; // Вызов вашей функции с параметрами $result = sendVote($user, $ip, $port, $key, $service); // Обработка результата if ($result) { wp_send_json_success($result); } else { wp_send_json_error('Failed to send vote'); } wp_die(); }
-
Использование
wp_remote_post
:
Если ваша цель — отправить данные на внешний сервер (игровой сервер), использованиеwp_remote_post
будет уместным. Это обеспечивает более безопасный и надежный способ отправки данных. Пример кода может выглядеть следующим образом:$response = wp_remote_post('https://urltoyour/gameserver/voting/endpoint', array( 'body' => array( 'username' => $user, 'key' => $key, 'ip' => $ip, 'port' => $port, 'service' => $service, ), )); if (is_wp_error($response)) { wp_send_json_error('Failed to connect to Game Server'); } else { wp_send_json_success('Vote sent successfully!'); }
Упрощение процесса
Если ваши функции работают корректно, но вам не хотелось бы помещать их в обработчик AJAX, использование require
располагает к организации кода, избегая укрупнения логики в одном месте. Однако, если функции не слишком громоздкие, их можно легко инкапсулировать внутри AJAX функции для простоты поддержки и тестирования.
Также, использование wp_remote_post
может упростить логику вместо написания сложных манипуляций с сокетами.
Заключение
В итоге, вы правильно находитесь на пути к реализации вашей логики через AJAX и PHP. Основные аспекты — это корректное подключение функций, безопасная проверка данных и использование стандартных методов WordPress для работы с внешними запросами. Это обеспечит вам максимальную надежность и производительность вашей системы.