Вопрос или проблема
Я разрабатываю пользовательский плагин для WordPress, чтобы добавить данные студентов, такие как ID, имя, курс, email и возможность загружать сертификаты. Плагин также должен включать форму поиска на фронтенде, которая позволяет пользователям искать по ID студента и отображать соответствующую информацию.
Однако после добавления всех данных студентов и нажатия кнопки “ДОБАВИТЬ СТУДЕНТА” на странице админ-панели WordPress и попытки сохранить, я сталкиваюсь со следующей ошибкой:
“На этом сайте произошла критическая ошибка. Пожалуйста, проверьте свой почтовый ящик администратора сайта для получения инструкций.”
Кроме того, когда я проверяю phpMyAdmin, данные не записываются в базу данных. Можете кто-нибудь помочь мне решить эту проблему?
Основной файл
<?php
/**
* Название плагина: Плагин управления студентами
* Описание: Плагин для управления данными студентов и сертификатами.
* Версия: 1.0
* Автор: Ваше имя
*/
if (!defined('ABSPATH')) {
exit; // Выйти, если доступ напрямую
}
// Включить функции админ-панели и фронтенда
include_once plugin_dir_path(__FILE__) . 'includes/admin-functions.php';
include_once plugin_dir_path(__FILE__) . 'includes/frontend-functions.php';
// Подключить стили
function smp_enqueue_styles() {
wp_enqueue_style('smp-styles', plugin_dir_url(__FILE__) . 'assets/style.css');
}
add_action('wp_enqueue_scripts', 'smp_enqueue_styles');
add_action('admin_enqueue_scripts', 'smp_enqueue_styles');
// Создать пользовательскую таблицу базы данных при активации плагина
function smp_create_student_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'student';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
student_id VARCHAR(50) NOT NULL,
student_name VARCHAR(100) NOT NULL,
course VARCHAR(100) NOT NULL,
phone VARCHAR(15),
email VARCHAR(100),
photo VARCHAR(255),
certificate VARCHAR(255),
PRIMARY KEY (id)
) $charset_collate;";
dbDelta($sql);
}
register_activation_hook(__FILE__, 'smp_create_student_table');
Код админ-страницы
<?php
// Добавить админ-меню для управления студентами
function smp_create_admin_menu() {
add_menu_page('Управление студентами', 'Управление студентами', 'manage_options', 'smp-student-management', 'smp_admin_page', 'dashicons-welcome-learn-more');
add_submenu_page('smp-student-management', 'Добавить нового студента', 'Добавить нового', 'manage_options', 'smp-add-student', 'smp_add_student_page');
}
add_action('admin_menu', 'smp_create_admin_menu');
// Админ-страница для просмотра студентов
function smp_admin_page() {
global $wpdb;
$table_name = $wpdb->prefix . 'student';
$results = $wpdb->get_results("SELECT * FROM $table_name");
echo '<div class="wrap"><h1>Список студентов</h1>';
echo '<table class="wp-list-table widefat fixed striped">';
echo '<thead><tr><th>ID</th><th>Имя</th><th>Курс</th><th>Телефон</th><th>Email</th><th>Сертификат</th><th>Действия</th></tr></thead>';
foreach ($results as $student) {
echo "<tr><td>{$student->student_id}</td><td>{$student->student_name}</td><td>{$student->course}</td><td>{$student->phone}</td><td>{$student->email}</td><td><img src="https://wordpress.stackexchange.com/questions/427213/{$student->certificate}" style="width:250px;height:250px;"/></td><td><a href="?page=smp-student-management&delete={$student->id}">Удалить</a></td></tr>";
}
echo '</table></div>';
}
// Страница добавления нового студента
function smp_add_student_page() {
echo '<div class="wrap"><h1>Добавить нового студента</h1>';
echo '<form method="post" enctype="multipart/form-data">';
echo '<label>ID студента</label><input type="text" name="student_id" required><br>';
echo '<label>Имя</label><input type="text" name="student_name" required><br>';
echo '<label>Курс</label><input type="text" name="course" required><br>';
echo '<label>Телефон</label><input type="text" name="phone"><br>';
echo '<label>Email</label><input type="email" name="email"><br>';
echo '<label>Фото</label><input type="file" name="photo" accept="image/*"><br>';
echo '<label>Сертификат</label><input type="file" name="certificate" accept="image/*"><br>';
echo '<input type="submit" name="submit_student" value="Добавить студента"></form></div>';
}
// Обработка отправки формы студента
if (isset($_POST['submit_student'])) {
global $wpdb;
$table_name = $wpdb->prefix . 'student';
$student_id = sanitize_text_field($_POST['student_id']);
$student_name = sanitize_text_field($_POST['student_name']);
$course = sanitize_text_field($_POST['course']);
$phone = sanitize_text_field($_POST['phone']);
$email = sanitize_email($_POST['email']);
$photo = wp_handle_upload($_FILES['photo'], ['test_form' => false]);
$certificate = wp_handle_upload($_FILES['certificate'], ['test_form' => false]);
$wpdb->insert($table_name, [
'student_id' => $student_id,
'student_name' => $student_name,
'course' => $course,
'phone' => $phone,
'email' => $email,
'photo' => $photo['url'],
'certificate' => $certificate['url']
]);
wp_redirect(admin_url('admin.php?page=smp-student-management'));
exit;
}
// Обработка удаления
if (isset($_GET['delete'])) {
global $wpdb;
$table_name = $wpdb->prefix . 'student';
$wpdb->delete($table_name, ['id' => intval($_GET['delete'])]);
wp_redirect(admin_url('admin.php?page=smp-student-management'));
exit;
}
Код фронтенда
<?php
// Шорткод для поиска студентов по ID
function smp_student_search_shortcode() {
ob_start();
echo '<form method="get">';
echo '<input type="text" name="student_id" placeholder="Введите ID студента">';
echo '<input type="submit" value="Поиск">';
echo '</form>';
if (isset($_GET['student_id'])) {
global $wpdb;
$table_name = $wpdb->prefix . 'students';
$student_id = sanitize_text_field($_GET['student_id']);
$student = $wpdb->get_row($wpdb->prepare("SELECT * FROM $table_name WHERE student_id = %s", $student_id));
if ($student) {
echo "<h2>Данные студента</h2>";
echo "<p><strong>Имя:</strong> {$student->student_name}</p>";
echo "<p><strong>Курс:</strong> {$student->course}</p>";
echo "<p><strong>Телефон:</strong> {$student->phone}</p>";
echo "<p><strong>Email:</strong> {$student->email}</p>";
echo "<p><strong>Сертификат:</strong> <img src="https://wordpress.stackexchange.com/questions/427213/{$student->certificate}" style="width:250px;height:250px;"/></p>";
} else {
echo "<p>Студент с этим ID не найден.</p>";
}
}
return ob_get_clean();
}
add_shortcode('student_search', 'smp_student_search_shortcode');
.
Ответ или решение
Устранение критической ошибки при сохранении данных студентов в пользовательском плагине WordPress
Разработка пользовательских плагинов для WordPress может быть сложной задачей, особенно когда возникают ошибки во время сохранения данных. В вашем случае, вы столкнулись с критической ошибкой при попытке сохранить данные студента в базе данных, которая не записывает никакой информации. Давайте рассмотрим возможные причины и решения этой проблемы.
Основные причины возникновения ошибки
-
Проблемы в обработке формы:
- Убедитесь, что данные формы отправляются правильно. Если поля формы не заполнены или содержат некорректные данные (например, некорректный адрес электронной почты), это может привести к ошибке.
-
Ошибки в коде вставки данных:
- Проверьте SQL-запрос и синтаксис метода
insert()
класса$wpdb
. Ошибки в названиях полей таблицы или передаче значений могут вызвать сбои.
- Проверьте SQL-запрос и синтаксис метода
-
Ошибки в загрузке файлов:
- Если ваша форма содержит поля загрузки (например, сертификаты или фотографии), ошибки при загрузке файлов могут привести к сбоям. Убедитесь, что файлы загружаются корректно и что путь к файлам записывается в базу данных правильно.
-
Проблемы с созданием таблицы:
- Убедитесь, что таблица
student
была создана успешно и что в ней действительно есть все необходимые столбцы. Проверьте наличие необходимых прав доступа к базе данных для пользователя, указанного вwp-config.php
.
- Убедитесь, что таблица
Шаги по диагностике и устранению проблем
-
Включение отладки WordPress:
- Включите режим отладки, добавив в ваш
wp-config.php
следующее:define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); define('WP_DEBUG_DISPLAY', false);
- Это создаст файл отладки в директории
/wp-content/debug.log
, где будут записываться все ошибки. Просмотрите этот файл для выявления конкретных проблем.
- Включите режим отладки, добавив в ваш
-
Проверка данных перед вставкой:
- Добавьте временные блоки
var_dump()
иdie()
перед вставкой данных в базу, чтобы убедиться, что все переменные содержат ожидаемые значения.var_dump($student_id, $student_name, $course, $phone, $email, $photo, $certificate); die();
- Добавьте временные блоки
-
Проверка работы функции
wp_handle_upload()
:- Убедитесь, что функция
wp_handle_upload()
возвращает правильный массив с ключамиurl
иfile
. Если загрузка не удалась, она может вернутьfalse
, что приведет к ошибке вставки данных.
- Убедитесь, что функция
-
Проверка наличия ошибок при выполнении запроса:
- После попытки выполнить вставку данных, проверьте наличие ошибок следующим образом:
if ($wpdb->insert($table_name, [...]) === false) { error_log($wpdb->last_error); }
- После попытки выполнить вставку данных, проверьте наличие ошибок следующим образом:
-
Проверьте настройки базы данных:
- Убедитесь, что ваш пользователь базы данных имеет соответствующие привилегии для выполнения операций вставки.
Заключение
Для успешного устранения критической ошибки при сохранении данных в вашем пользовательском плагине WordPress ключевым моментом является тщательный анализ кода и понимание того, как работает WordPress с базами данных. Используйте отладку и обеспечьте надлежащую обработку ошибок, чтобы выявить и устранить причины проблемы.
Если все указанные шаги не помогут разрешить проблему, рекомендуется обратиться за помощью к сообществу разработчиков WordPress или на специализированные форумы, где можно получить поддержку от более опытных специалистов.