Вызов функции PHP с несколькими параметрами, которая находится вне обработчика AJAX

Вопрос или проблема

В: Как правильно вызвать функцию PHP с несколькими параметрами из AJAX-обработчика?
В: Я правильно вызываю функцию php?
В: Есть ли более простой способ сделать это?


Элемент страницы
Пользователь нажимает кнопку.

Действие:
Нажатие вызовет код php для подключения к внешнему серверу с использованием следующих параметров:

  1. Имя пользователя 2. IP-адрес 3. Порт 4. Открытый ключ 5. Сервис

Цель:
Отправить строку голосования (с хоста A) на внешний игровой сервер (хост B).
Мне не нужно обновлять какой-либо контент WordPress. Примечание: Я владелец обоих серверов.

WordPress Версия: 5.4.1 Версия PHP на сервере 7.3

Изначально у меня был мой пользовательский код php в отдельном файле “/wp-contents/plugins/my-plugin/votifier.php”. Я пытался вызывать свои функции в этом файле из AJAX-обработчика.

  1. MyPlugin.php
  2. sendvote.js
  3. 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.

Решение проблемы

  1. Подключение вашего файла функций (если необходимо):
    Если вы все еще хотите оставить свою функцию в отдельном файле, убедитесь, что он правильно подключен. Например, вы можете использовать include или require в вашем файле MyPlugin.php для загрузки функций из votifier.php:

    include_once plugin_dir_path(__FILE__) . 'votifier.php';

    Это позволит вам вызывать функции из votifier.php в вашем AJAX обработчике.

  2. Передача параметров:
    Как вы уже делаете, вы передаете параметры через 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();
    }
  3. Использование 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 для работы с внешними запросами. Это обеспечит вам максимальную надежность и производительность вашей системы.

Оцените материал
Добавить комментарий

Капча загружается...