Вопрос или проблема
На моем сайте, через 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) и просмотреть журналы ошибок, которые могут дать больше информации о том, что именно идет не так.