Ajax не работает для вставки, запроса и получения данных.

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

На моем сайте, через form, я отправляю/регистрирую одну и ту же информацию в базе данных, выполняю SELECT/запрос и возвращаю ее! Возвращаю последнюю таблицу, сохраненную в базе данных, только что введенную пользователем в форму (вместе с некоторой дополнительной информацией из базы данных).

Чтобы отобразить эти значения из базы данных в modal bootstrap, необходимо, чтобы страница не обновлялась. Для этого я вставил AJAX следующим образом:

$(document).ready(function(){
      $('#enviar').click(function(){
          $.ajax({
          //Вызов AJAX в WORDPRESS 
          url: 'wp-admin/admin-ajax.php',
          type: 'POST',              
          //ВСТАВИТЬ, ЗАПРОС И ОТОБРАЗИТЬ ДЛЯ ПОЛЬЗОВАТЕЛЯ      
          data: 'action=prancha',                  
          error: function(){
              alert('ОШИБКА!!!');
          },
          //ЕСЛИ OK, ОТОБРАЗИТЬ ДЛЯ ПОЛЬЗОВАТЕЛЯ В DIV "RESULT"
          success: function(data){
              $('#result').html(data);
          }               
      });
    });
    });

МОИ FUNCTIONS.PHP:

function prancha(){
  header('Content-Type: text/html; charset=utf-8');

  include "../../../wp-config.php";

      /* ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ  */
  $nome = "";
  $email = "";
  $estilo = "";
  $experiencia = "";
  $altura = "";
  $peso = "";

  // ВАЛИДАЦИЯ
  if(!empty($_POST)){     
     $nome = $_POST['nome'];
     $email = $_POST['email'];
     $estilo = $_POST['estilo'];
     $experiencia = $_POST['experiencia'];
     $altura = $_POST['altura'];
     $peso = $_POST['peso'];

     cadastra_user($nome, $email, $estilo, $experiencia, $altura, $peso);
 }

  //ВСТАВИТЬ В БАЗУ ДАННЫХ ИМЯ, EMAIL, СТИЛЬ, ОПЫТ, ВЫСОТА И ВЕС
function cadastra_user($nome, $email, $estilo, $experiencia, $altura, $peso){          
    global $wpdb;

    $table="user";

    $data = array(      
      'nome' => $nome,
      'email' => $email,
      'estilo' => $estilo,
      'exp' => $experiencia,
      'altura' => $altura,
      'peso' => $peso,
    );

    $updated = $wpdb->insert( $table, $data );

    if ( ! $updated ) {
      $wpdb->print_error();
    }    
}   

//СОЕДИНЕНИЕ С БАЗОЙ ДАННЫХ ДЛЯ ВЫПОЛНЕНИЯ SELECT
include "db.php";

  function BuscaAlgo($conexao){

  // ЗАПРОС + INNER JOIN В БАЗЕ ДАННЫХ
 $query = "SELECT  USU.usuario,
                   USU.nome,
                   USU.exp,
                   USU.altura,
                   USU.peso,
                   PRAN.exp_ref,
                   PRAN.altura_ref,
                   PRAN.peso_ref,
                   PRAN.tipo_prancha,
                   PRAN.tamanho_prancha, 
                   PRAN.meio_prancha, 
                   PRAN.litragem_prancha       
                    FROM DADOS_USUARIO AS USU 
                         INNER JOIN PRANCHA AS PRAN
                             on USU.exp = PRAN.exp_ref
                              WHERE USU.altura = PRAN.altura_ref
                                AND USU.peso = PRAN.peso_ref
                                  ORDER BY USU.usuario DESC LIMIT 1";

  $resultado = mysqli_query($conexao,$query);

  $retorno = array();

  while($experiencia = mysqli_fetch_assoc($resultado)){
    $retorno[] = $experiencia;
  }

 return $resultado;
}

//ОТОБРАЖАЕТ ЗАПРОС ДЛЯ ПОЛЬЗОВАТЕЛЯ      
$resultado = array();
$resultado = BuscaAlgo($conexao);

foreach($resultado as $valor){
    echo $valor["usuario"]; print(".  .  .  ."); 
    echo $valor["nome"]; print(".  .  .  ."); 
    echo $valor["exp"]; print(".  .  .  ."); 
    echo $valor["altura"]; print(".  .  .  ."); 
    echo $valor["peso"]; print(".  .  .  ."); 
    print("///////");
    echo $valor["tipo_prancha"]; print(".  .  .  ."); 
    echo $valor["tamanho_prancha"]; print(".  .  .  ."); 
    echo $valor["meio_prancha"]; print(".  .  .  ."); 
    echo $valor["litragem_prancha"];  
}  

    die(); //КОНЕЦ ВЫПОЛНЕНИЯ
}
//ДОБАВИТЬ AJAX HOOKS В WORDPRESS
add_action('wp_ajax_prancha', 'prancha');
add_action('wp_ajax_nopriv_prancha', 'prancha');

Код прокомментирован, в основном я сделал:

AJAX:

  • В поле `URL` вызовите встроенный в WordPress `admin-ajax.php`.
  • В поле `DATA` вызовите функцию, которая выполняет регистрацию, запрос и отображает для пользователя.
  • В поле `SUCCESS` напечатайте значение `data`.

ФУНКЦИИ: Я делаю код для регистрации в базе данных, выполняю запрос и печатаю с помощью echo.

Ошибки в AJAX возвращают мне сообщение об ошибке. Это ошибка самого AJAX. Поле error: function(){ alert('ОШИБКА!!!');},

Как я могу это исправить?
Что я делаю не так?

Примечание 1: Когда я вставляю код, который находится в моем ‘functions, код регистрации, запрос иecho’ для отображения напрямую в footer.php, это работает. Поэтому можно понять, что ошибка не в коде вставки, запроса или отображения.

ПРИМЕЧАНИЕ 2: Я хочу отобразить результат из базы данных внутри modal bootstrap. Сначала я просто отображаю на экране, чтобы проверить, что все в порядке. После этого я изучу, как поместить эти данные в modal, хотя это не основная тема поста, предложения о том, как это сделать, также приветствуются.

Я бы предложил погуглить “учебники по ajax wordpress”. Вот один, который был полезен для меня.
https://premium.wpmudev.org/blog/using-ajax-with-wordpress/

Первая проблема, которую я вижу, заключается в том, что вы не указали, что ваша переменная ‘action’ является. JavaScript AJAX-запрос указывает, какая функция целевая в атрибуте ‘action’. В WP это крючок, который выполняет ваш серверный AJAX код. Вот как работают мои AJAX-запросы:

jQuery.post(ajaxurl,
    {"action" : "popover_content",
     "type" : this.data.subtype, 
     "key"  : this.data.key},
      function(content) {
        showPopover(e, content);
  }

Я создал свой собственный плагин WP (в соответствии с учебниками) для обработки AJAX-запроса. Код там выглядит следующим образом:

add_action( 'wp_ajax_popover_content', 'popover_content' );

function popover_content() {
...
}

Обратите внимание, что действие в JS, “popover_content”, соответствует крючку в add_action. Другими словами, если у вас есть add_action( wp_ajax_my_ajax_action, my_ajax_function), то переменная действия в JS должна быть my_ajax_action.

Также обратите внимание, что WP определяет глобальную переменную ajaxurl, так что вам не нужно указывать путь/имя admin-ajax.php.

Лично мне было проще заставить действие возвращать простое сообщение, пока я работал над AJAX-запросом на фронтенде; как только это сработало, выполнение запроса к базе данных и возврат содержимого было простым.

PS. Вы можете видеть, что я помещаю возвращаемое содержимое в всплывающее окно, поэтому разместить ваше содержимое в модальном окне должно быть легко.

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

Чтобы решить проблему с AJAX в вашем проекте WordPress, давайте разберем шаги, которые могут привести к ошибкам, и как их устранить. Мы начнем с анализа вашего JavaScript кода, затем перейдем к PHP функции, и после этого обсудим некоторые практические советы.

1. Проверка JavaScript кода

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

$(document).ready(function(){
    $('#enviar').click(function(){
        $.ajax({
            url: 'wp-admin/admin-ajax.php',
            type: 'POST',
            data: 'action=prancha',
            error: function(){
                alert('ERRO!!!');
            },
            success: function(data){
                $('#result').html(data);
            }               
        });
    });
});

Что проверить:

  • Путь к admin-ajax.php: Убедитесь, что путь к wp-admin/admin-ajax.php корректен, особенно если вы работаете в локальной среде. Можно использовать встроенную переменную ajaxurl, которая определена в WordPress.

    Пример:

    url: ajaxurl,
  • Передача данных: В вашем коде вы передаете action=prancha как строку. Чтобы передать дополнительные данные, используйте объект:

    data: {
        action: 'prancha',
        nome: $('#nome').val(),
        email: $('#email').val(),
        estilo: $('#estilo').val(),
        experiencia: $('#experiencia').val(),
        altura: $('#altura').val(),
        peso: $('#peso').val()
    },

2. Проверка PHP-функции

Теперь перейдем к вашей PHP функции, которая обрабатывает AJAX запрос:

function prancha(){
    header('Content-Type: text/html; charset=utf-8');

    if(!empty($_POST)){     
        $nome = $_POST['nome'];
        $email = $_POST['email'];
        $estilo = $_POST['estilo'];
        $experiencia = $_POST['experiencia'];
        $altura = $_POST['altura'];
        $peso = $_POST['peso'];

        cadastra_user($nome, $email, $estilo, $experiencia, $altura, $peso);
    }

    // Код для выборки данных...
    $resultado = BuscaAlgo($conexao);

    foreach($resultado as $valor){
        echo implode(".  .  .  .", [
            $valor["usuario"],
            $valor["nome"],
            $valor["exp"],
            $valor["altura"],
            $valor["peso"],
            $valor["tipo_prancha"],
            $valor["tamanho_prancha"],
            $valor["meio_prancha"],
            $valor["litragem_prancha"]
        ]);
        print("///////");
    }  

    die(); // Завершение выполнения
}

Что проверить:

  • Функция cadastra_user: Убедитесь, что функция работает корректно и возвращает true/false в зависимости от успешности вставки данных.

  • Код для выборки: Убедитесь, что $conexao правильно инициализирован. Если используется $wpdb, нет необходимости включать другой файл соединения.

  • Проверка ошибок: Включите вывод ошибок в PHP, чтобы отладить, что происходит, если запрос не удался:

    if ( ! $updated ) {
        echo $wpdb->last_error; // Вывод ошибки
    }

3. Бесполезные сообщения

Ваша текущая структура обработки ошибок в AJAX не дает достаточно информации для понимания ошибки. Вместо общего alert('ERRO!!!'), вы можете вывести текст ошибки через console.log(data) в функции success или добавить в конструкцию error вывод информации о статусе ответа.

4. Встраивание в Bootstrap Modal

По поводу отображения результатов в модальном окне Bootstrap, вы можете сделать что-то вроде этого:

success: function(data) {
    $('#myModal .modal-body').html(data); // Предполагается, что у вас есть модал с классом myModal
    $('#myModal').modal('show'); // Показать модал
}

Заключение

Проверив и исправив указанные моменты, вы сможете устранить проблемы с AJAX в вашем проекте. Убедитесь также, что ваш код организован и соответствует стандартам кодирования WordPress. Если ошибка сохраняется, то вы можете активировать режим отладки в WordPress (define('WP_DEBUG', true); в wp-config.php) и просмотреть журналы ошибок, которые могут дать больше информации о том, что именно идет не так.

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

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