Не удается успешно выполнить AJAX-скрипт для вызова конкретной функции функции.php. Используется XAMPP localhost для тестирования.

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

Я пытался понять AJAX в течение последних 12 часов и постепенно теряю терпение. Как я могу просто передать две основные даты через форму или любым другим способом, не обновляя страницу, и выполнить PHP-функцию, которая содержит JS-скрипт?

Перед тем, как я передам значения скрипту, я просто хочу вывести массив данных, который я передаю, чтобы увидеть, работает ли AJAX. Кнопка формы просто обновляет страницу, независимо от всего, так что я не думаю, что AJAX вообще срабатывает. Я пробую на https://localhost для xampp. Я не знаю, что не хватает, чтобы остановить обновление и запустить AJAX-скрипт по нажатию кнопки.

Буду признателен за любые идеи.

functions.php

<?php
add_action('wp_enqueue_scripts','enqueue_parent_styles');
add_action('wp_ajax_nopriv_lineChartCustom', 'lineChartCustomCreate');
add_action('wp_ajax_lineChartCustom', 'lineChartCustomCreate');

function lineChartCustomCreate(){

    if ( isset( $_POST['dataForPHP'])){
        //вывод массива данных
    echo $dataForPHP;
    //<script>Некоторые скрипты для генерации графиков с использованием массива данных</script>
    }
}
?>

page-template.php

<?php
    echo "<form id='my-form'>
        Выберите диапазон дат:
        <input type='date' name='date1'>
        <input type='date' name='date2'>
        <input type='submit' id='submit' value='отправить'>
        </form>";
?>
<script>
        jQuery('#submit').on('click', function() {

            let formData = jQuery('#my-form').serializeArray(); // получает данные формы в виде массива

           jQuery.ajax({
                     url: ajaxurl, // стандартный ajax url WordPress
                     type: 'POST',
                     data: {
                         action: 'lineChartCustom', // используйте это действие для обработки события
                         dataForPHP: formData // это данные вашей формы, которые будут отправлены в PHP под именем dataForPHP                
                 });
             });
         });
</script>

Вы должны добавить wp_die(); в конце вашей PHP-функции.

Но вы также можете отправить ответ с помощью wp_send_json, wp_send_json_error или wp_send_json_success. Эти функции также завершают выполнение функции.

Страница обновляется, потому что вы отправляете форму синхронно (традиционно). Чтобы отправить форму с помощью AJAX, ваша функция, подключенная к onclick, должна вернуть false или вызвать .preventDefault() на событии отправки.

jQuery( "#my-form" ).submit(function( event ) {
    event.preventDefault();
    //
    // ваш код...
});

// --- или --- 

jQuery('#submit').on('click', function() {
    // ....
    return false;
});

Правка:

Переместите ваш javascript-код в отдельный файл (например, myscript.js). Включите этот файл на странице, используя wp_enqueue_scripts() (хук). В коде вы использовали ajaxurl, но нигде не определили его. wp_localize_script() используется для передачи значений из PHP в javascript, таким образом вы установите адрес для AJAX в переменной ajax_url.

page-template.php:

<?php
echo "<form id='my-form'>
    Выберите диапазон дат:
    <input type='date' name='date1'>
    <input type='date' name='date2'>
    <input type='submit' id='submit' value='отправить'>
    </form>";
?>

myscript.js:

jQuery('#submit').on('click', function() {

    let formData = jQuery('#my-form').serializeArray(); // получает данные формы в виде массива

    jQuery.ajax({
        url: ajax_object.ajax_url, // стандартный ajax url WordPress
        type: 'POST',
        data: {
            action: 'lineChartCustom', // используйте это действие для обработки события
            dataForPHP: formData // это данные вашей формы, которые будут отправлены в PHP под именем dataForPHP                
        }
    }).done(function( msg ) {
        alert( msg );
    });
    return false;
});

functions.php

add_action( 'wp_enqueue_scripts', 'my_enqueue' );
function my_enqueue() {

    wp_enqueue_script( 'my-javascript', get_stylesheet_directory_uri(). '/myscript.js',  array('jquery'), '', true );

    // в JavaScript свойства объектов обращаются как ajax_object.ajax_url
    wp_localize_script( 'my-javascript', 'ajax_object',
            array( 'ajax_url' => admin_url('admin-ajax.php') ) );
}

add_action('wp_enqueue_scripts','enqueue_parent_styles');
add_action('wp_ajax_nopriv_lineChartCustom', 'lineChartCustomCreate');
add_action('wp_ajax_lineChartCustom', 'lineChartCustomCreate');

function lineChartCustomCreate(){

    if ( isset( $_POST['dataForPHP']) ){
        //вывод массива данных
        print_r($_POST['dataForPHP']);
    }
    die();
}

Ответ или решение

Решение проблемы с выполнением AJAX-скрипта для вызова функции в PHP

Если вы столкнулись с проблемами при выполнении AJAX-скрипта для вызова функции в functions.php, и ваша страница перезагружается вместо выполнения AJAX-запроса, это может быть вызвано несколькими факторами. Рассмотрим, как правильно настроить AJAX в WordPress и избежать перезагрузки страницы.

Шаг 1: Настройка формы

Ваш код формы на page-template.php выглядит правильно, но мы внесем несколько улучшений для гарантии, что AJAX будет работать корректно. Важно использовать event.preventDefault() в обработчике события для предотвращения перезагрузки страницы:

<?php
echo "<form id='my-form'>
    Select Date Range:
    <input type='date' name='date1'>
    <input type='date' name='date2'>
    <input type='submit' id='submit' value='submit'>
</form>";
?>
<script>
// Изолируем весь JavaScript в функцию, чтобы убедиться, что документ загружен
jQuery(document).ready(function($) {
    $('#my-form').on('submit', function(event) {
        event.preventDefault(); // Предотвращаем стандартное поведение формы

        let formData = $(this).serializeArray(); // Получаем данные формы в виде массива

        $.ajax({
            url: ajax_object.ajax_url, // URL для AJAX-запроса
            type: 'POST',
            data: {
                action: 'lineChartCustom', // Действие для обработки в PHP
                dataForPHP: formData // Данные, которые отправляются на сервер
            },
            success: function(response) {
                alert('Ответ от PHP: ' + response); // Обработка успешного ответа
            },
            error: function(jqXHR, textStatus, errorThrown) {
                alert('Ошибка: ' + textStatus + ' - ' + errorThrown); // Обработка ошибок
            }
        });
    });
});
</script>

Шаг 2: Подключение скрипта в functions.php

Теперь необходимо убедиться, что ваш скрипт будет корректно подключен, и AJAX URL будет доступен. Используйте функцию wp_enqueue_script() и wp_localize_script():

add_action('wp_enqueue_scripts', 'my_enqueue');
function my_enqueue() {
    wp_enqueue_script('my-javascript', get_stylesheet_directory_uri() . '/myscript.js', ['jquery'], null, true);

    // Передаем данные обратно в JavaScript
    wp_localize_script('my-javascript', 'ajax_object', [
        'ajax_url' => admin_url('admin-ajax.php') // URL для AJAX-запросов WordPress
    ]);
}

Шаг 3: Обработка AJAX-запроса в functions.php

В вашей функции lineChartCustomCreate необходимо убедиться, что данные корректно принимаются и возвращаются. Также добавьте wp_die() в конце функции для корректной остановки выполнения:

add_action('wp_ajax_nopriv_lineChartCustom', 'lineChartCustomCreate');
add_action('wp_ajax_lineChartCustom', 'lineChartCustomCreate');

function lineChartCustomCreate() {
    if (isset($_POST['dataForPHP'])) {
        // Здесь вы можете обрабатывать ваши данные
        echo 'Полученные данные: ';
        print_r($_POST['dataForPHP']); // Отправляем данные обратно как пример
    }
    wp_die(); // Завершаем выполнение
}

Шаг 4: Проверка

После внесения этих изменений, выполните тестирование:

  1. Запустите ваш локальный сервер XAMPP.
  2. Откройте страницу с вашей формой.
  3. Выберите даты и нажмите «submit».

Если все выполнено правильно, вы должны получить всплывающее окно с ответом от PHP без перезагрузки страницы. Это отличное первое испытание для использования AJAX в вашем проекте.

Заключение

Работа с AJAX в WordPress может показаться сложной на первых порах, но следуя этим шагам, вы сможете настроить корректную обработку запросов. Убедитесь также, что отладку проводите в консоли браузера, где можно проверить, отправляются ли AJAX-запросы и получаете ли вы необходимые ответы от сервера. Надеюсь, эти рекомендации помогут вам разобраться в ваших затруднениях!

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

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