Ajax не определен

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

Stack Exchange слушаю давно, впервые звоню.

Я нашел примеры на сайте developer.wordpress, но все равно испытываю трудности.

Локализация скриптов:
wp_localize_script()

В файле functions.php моей темы у меня есть:

function wp_my_ajax_script() {
   wp_localize_script( 'ajax_handle_agent_search', 'myAjax', admin_url( 'admin-ajax.php' ));        

   wp_enqueue_script( 'ajax_handle_agent_search' );
}
add_action( 'wp_enqueue_scripts', 'wp_my_ajax_script' );

И на моей странице я добавил виджет HTML-кода, который содержит:

<script>
jQuery(document).ready( function() {
    console.log("Документ загружен");
   jQuery("#searchButton").click( function(e) {
      console.log("Кнопка поиска нажата");
      console.log("Ajax: " . myAjax);
      e.preventDefault(); 
      var zipCode = document.getElementById("inputField").value;
      console.log("Введен почтовый индекс: " + zipCode);
      jQuery.ajax({
         type : "post",
         dataType : "json",
         url : myAjax.ajaxurl,
         data : {
             action: "zip_search_action",
             zip_code : zipCode
         },
         success: function(response) {
            if(response.type == "success") {
                console.log("Успех");
                document.getElementById("results").html = response.data;
            }
            else {
                console.log("Успех, но не сработало!");
            }
         },
        error: function(errorThrown){
            console.log("Ошибка, ошибка выброшена!");
            console.log(errorThrown);
        }
      })   

   });

});
</script>

<input type="text" id="inputField">
<input type="button" value="Поиск" id="searchButton">

Затем я загружаю страницу, ввожу почтовый индекс в поле ввода и нажимаю кнопку. Консоль инструментов разработчика показывает:

Консоль инструментов разработчика с сообщением об ошибке

Я работаю над этим уже несколько недель и значительно улучшил свои навыки разработки для WordPress, но веб-разработка не является моей сильной стороной, поэтому, когда я чувствую, что исчерпал свои возможности, обращаюсь за помощью. Буду признателен за любые рекомендации, которые помогут мне продвинуться вперед.

Заранее спасибо!

=================================
ИЗМЕНЕНИЕ 12/03/20 в 1342 CST

Я перенес код JS в отдельный файл в папку JS темы с разрешениями 0755. Затем я добавил новую функцию в файл functions.php с вызовами функций enqueue и localize (как показано ниже)

function my_load_scripts() {
    wp_enqueue_script( 'zip_js', get_template_directory_uri() . '/js/zip_search.js' );
    wp_localize_script( 'zip_js', 'Zip_JS', null);
}
add_action('wp_enqueue_scripts', 'my_load_scripts');

Теперь в консоли отображается:
Ошибка jQuery

================================++++= ИЗМЕНЕНИЕ 13/03/20 в 0806 CST

Я продвинулся дальше. По крайней мере, я так считаю. Ниже приведен код, как он сейчас выглядит в WordPress, за которым следует скриншот ошибки в консоли.

В моем JS файле ():

jQuery(document).ready( function() {
    console.log("Документ загружен");
   jQuery("#searchButton").click( function(e) {
      console.log("Кнопка поиска нажата");
      e.preventDefault(); 
      var zipCode = document.getElementById("inputField").value;
      console.log("Введен почтовый индекс: " + zipCode);
      jQuery.ajax({
         type : "post",
         dataType : "json",
         url : myAjax.ajaxurl,
         data : {
             action: "zip_search",
             zip_code : zipCode
         },
         success: function(response) {
            if(response.type == "success") {
                console.log("Успех");
                //jQuery("#results").html(response.data);
                document.getElementById("results").html = response.data;
            }
            else {
                console.log("Успех, но не сработало!");
                console.log(response);
            }
         },
        error: function(errorThrown){
            console.log("Ошибка, ошибка выброшена!");
            console.log(errorThrown);
        }
      });   
   });

});

В functions.php, включая мой запрос к базе данных на этот раз:

function my_load_scripts() {

    // Подключение javascript на фронтенде.
    wp_enqueue_script(
        'zip_js',
        get_template_directory_uri() . '/js/zip_search.js',
        array('jquery')
    );

    // Функция wp_localize_script позволяет нам вывести путь ajax_url для использования нашего скрипта.
    wp_localize_script(
        'zip_js',
        'myAjax',
        array( 'ajax_url' => admin_url( 'admin-ajax.php' ) )
    );

}
add_action( 'wp_enqueue_scripts', 'my_load_scripts' );



function zip_search()
{
    global $wpdb;

    $output="";

    $zip = $_REQUEST['zipCode'];    

    $query = 'SELECT county FROM Agent WHERE zip = %s';
    $result = $wpdb->get_var( $wpdb->prepare($query, $zip) );
    $output .= "<p>";
    $output .= $result;
    $output .= "</p>";

    $query = 'SELECT zip, county, zone, agent FROM Agent WHERE county = %s';

    $results = $wpdb->get_results( $wpdb->prepare($query, $result) ); 


    $output .= "<ul>";
    foreach( $results as $result ) 
    {
        $output .= "<li>".$result->zip." - ".$result->zone." - ".$result->agent."</li>";
    }
    $output .= "</ul>";

    $result['type'] = "success";
    $result['data'] = $output;

    return json_encode($result);
    die();
}
add_action('wp_ajax_zip_search_action', 'zip_search');
add_action( 'wp_ajax_nopriv_zip_search_action', 'zip_search' );

На моей странице WordPress:

<input type="text" id="inputField">
<input type="button" value="Поиск" id="searchButton">

Консоль:
Новая ошибка в консоли со статусом 200 и текстом статуса "OK"


ИЗМЕНЕНИЕ: 13/03/2020 в 11:52am CST

Добавление рабочего кода. Надеюсь, любой, кто сталкивается с подобной проблемой, сможет увидеть, что я сделал, чтобы это работало, и это поможет каким-то образом.

JS:

jQuery(document).ready( function() {
    console.log("Документ загружен");
   jQuery("#searchButton").click( function(e) {
      console.log("Кнопка поиска нажата");
      e.preventDefault(); 
      var zipCode = document.getElementById("inputField").value;
      console.log("Введен почтовый индекс: " + zipCode);
      jQuery.ajax({
         type : "post",
         dataType : "json",
         url : myAjax.ajaxurl,
         data : {
             'action': "zip_search",
             'zip_code' : zipCode
         },
         success: function(response) {
            console.log(response.data);
            if(response.success) {
                console.log("response.type == успех");
                jQuery("#results").html(response.data.data);
            }
            else {
                console.log("response.type == иначе");
                console.log(response.data);
            }
         },
        error: function(errorThrown){
            console.log("Ошибка, ошибка выброшена!");
            console.log(errorThrown);
        }
      })
   })
})

functions.php:

add_action('wp_ajax_zip_search', 'zip_search');
add_action('wp_ajax_nopriv_zip_search', 'zip_search' );
function zip_search()
{
    global $wpdb;

    $output="";

    $zip = $_REQUEST["zip_code"];   

    $query = 'SELECT county FROM Agent WHERE zip = %s';
    $result = $wpdb->get_var( $wpdb->prepare($query, $zip) );
    $output .= "<p>";
    $output .= $result;
    $output .= "</p>";

    $query = 'SELECT zip, county, zone, agent FROM Agent WHERE county = %s';

    $results = $wpdb->get_results( $wpdb->prepare($query, $result) ); 


    $output .= "<ul>";
    foreach( $results as $result ) 
    {
        $output .= "<li>".$result->zip." - ".$result->zone." - ".$result->agent."</li>";
    }
    $output .= "</ul>";

    $response = array(
        'data' => $output,
    );

    wp_send_json_success($response);

    //return json_encode($response);
    //die();
}

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

    // Подключение javascript на фронтенде.
    wp_enqueue_script(
        'zip_js',
        get_template_directory_uri() . '/js/zip_search.js',
        array('jquery')
    );

    // Функция wp_localize_script позволяет нам вывести путь ajax_url для использования нашего скрипта.
    wp_localize_script(
        'zip_js',
        'myAjax',
        array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) )
    );

}

HTML:

<input type="text" id="inputField" placeholder="Введите почтовый индекс здесь">
<input type="button" value="Поиск" id="searchButton">

jQuery не определен, потому что вы не указали jQuery как зависимость для вашего скрипта, поэтому wp не знает, что должен загрузить его для вашего скрипта.

wp_localize_script должен вызываться на скрипте, который уже связан через wp_enqueue_script, поэтому сначала вы выполняете wp_enqueue_script, а затем wp_localize_script, как вы делаете в вашем обновлении.

Еще одна вещь о wp_localize_script заключается в том, что она принимает 3 аргумента (см. https://developer.wordpress.org/reference/functions/wp_localize_script/), и последний из них является ассоциативным массивом.

Так что, если в вашем JS коде вы хотите получить ajaxurl через myAjax.ajaxurl, вам нужно вызвать wp_localize_script( 'zip_js', 'myAjax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ));

Код ниже учитывает ваше новое название скрипта как zip_js, и глобальная js переменная теперь Zip_JS, так что вы будете получать доступ к вашему ajaxurl в js коде как Zip_JS.ajaxurl вместо myAjax.ajaxurl.

Вот что вам нужно сделать, чтобы исправить ошибку отсутствия jQuery и правильно использовать локализованный скрипт:

function my_load_scripts() {
    wp_enqueue_script( 'zip_js', get_template_directory_uri() . '/js/zip_search.js', array('jquery') );
    wp_localize_script( 'zip_js', 'Zip_JS', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ));
}
add_action('wp_enqueue_scripts', 'my_load_scripts');

        #попробуйте это
    function wpb_adding_scripts() {
        wp_register_script('my_amazing_scripts', plugins_url('jquery.js', __FILE__), array('jquery'), '3.4.1', true);
        wp_enqueue_script('my_amazing_scripts');
    }


        <form id="article_form" name="article_form" class="wordpress-ajax-form" method="post" action="<?php echo admin_url('admin-ajax.php'); ?>" enctype="multipart/form-data" >
        <input type="hidden" name="action" value="custom_action">
        </form>

<script>
jQuery(document).ready(function(evt) {
  $(".wordpress-ajax-form").submit(function(evt){  

            $.ajax({
                url: $('#article_form').attr('action'),
                type: 'POST',
                data: formData,
                async: true,
                cache: false,
                contentType: false,
                enctype: 'multipart/form-data',
                processData: false,
                success: function (response) {
                 alert(response);

                }
              });
    });  
  });  

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

Ошибка "Ajax is not defined" в WordPress при использовании AJAX может возникнуть по нескольким причинам. Давайте разберемся с вашей проблемой детально и предложим решения.

Причины возникновения ошибки

  1. Не подключен jQuery: Вы не указали зависимость от jQuery при подключении вашего скрипта. Поскольку WordPress не знает о необходимости загрузки jQuery для вашего скрипта, это может привести к ошибкам.

  2. Неправильное использование wp_localize_script: Вы должны вызывать wp_localize_script после wp_enqueue_script, и он должен ссылаться на уже загруженный скрипт. При этом его последнее значение должно быть ассоциативным массивом.

  3. Опечатка в именах переменных: Убедитесь, что вы правильно используете имена переменных в вашем JavaScript-коде.

Рекомендации по исправлению

Чтобы решить указанные проблемы, выполните следующие шаги:

1. Исправление подключаемого скрипта

Убедитесь, что вы правильно подключаете ваш скрипт с зависимостью от jQuery в файле functions.php:

function my_load_scripts() {
    // Подключаем JavaScript со ссылкой на jQuery
    wp_enqueue_script(
        'zip_js', 
        get_template_directory_uri() . '/js/zip_search.js',
        array('jquery'), // добавляем зависимость от jQuery
        null, 
        true // помещаем скрипт в footer
    );

    // локализация скрипта
    wp_localize_script(
        'zip_js', 
        'myAjax', 
        array('ajaxurl' => admin_url('admin-ajax.php')) // правильно вызываем ajaxurl
    );
}
add_action('wp_enqueue_scripts', 'my_load_scripts');

2. Исправление JavaScript кодировки

Убедитесь, что ваш JavaScript код правильно использует переменную myAjax:

jQuery(document).ready(function() {
    jQuery("#searchButton").click(function(e) {
        e.preventDefault(); 
        var zipCode = document.getElementById("inputField").value;

        jQuery.ajax({
            type: "post",
            dataType: "json",
            url: myAjax.ajaxurl, // используем правильный путь
            data: {
                action: "zip_search_action", // исправьте на ваше действие
                zip_code: zipCode
            },
            success: function(response) {
                if(response.success) { // используйте правильную проверку
                    jQuery("#results").html(response.data);
                } else {
                    console.log("Error: ", response.data);
                }
            },
            error: function(errorThrown) {
                console.log("In error, error thrown!");
                console.log(errorThrown);
            }
        });
    });
});

3. Правильная обработка ответа на сервере

Убедитесь, что в вашей функции обработки AJAX-запроса все возвращается корректно, и используйте функции WordPress для возврата данных:

add_action('wp_ajax_zip_search_action', 'zip_search'); // для авторизованных пользователей
add_action('wp_ajax_nopriv_zip_search_action', 'zip_search'); // для неавторизованных пользователей

function zip_search() {
    global $wpdb;
    $output = '';
    $zip = $_POST['zip_code'];

    // обработка запроса к базе данных
    $query = 'SELECT county FROM Agent WHERE zip = %s';
    $result = $wpdb->get_var($wpdb->prepare($query, $zip));

    if ($result) {
        $output .= "<p>$result</p>";
    } else {
        $output .= '<p>No results found.</p>';
    }

    // возвращаем данные в формате JSON
    wp_send_json_success(array('data' => $output));

    // прекращаем выполнение скрипта после отправки ответа
    wp_die();
}

Заключение

Соблюдение этих рекомендаций должно помочь вам исправить ошибку "Ajax is not defined" и реализовать функциональность AJAX в WordPress. Проверьте все изменения и протестируйте код, чтобы убедиться в его работоспособности. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью.

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

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