Вопрос или проблема
Отправка формы на admin-post.php в WordPress
Я пытался заставить работать основной плагин и следовал тому, что, по моему мнению, является правильным процессом для отправки формы на admin-post.php.
Однако я только и получаю белый экран смерти после отправки формы.
Это мой основной файл плагина
<?php
/**
* Название плагина: Тестовая форма
*/
function wp_meetings_menu(){
add_menu_page('Встречи', 'Встречи', 'manage_options', 'wp_meetings', 'wp_meetings_form');
}
add_action('admin_menu', 'wp_meetings_menu');
function wp_meetings_form() {
?>
<div class="wrap">
<h2>Встречи</h2>
<form method="post" action="<?php echo admin_url('admin-post.php'); ?>" enctype="multipart/form-data">
<label>Дата и время:</label>
<input type="datetime-local" name="datetime"><br><br>
<label>Выпадающий список 1:</label>
<select name="dropdown1">
<option value="option1">Вариант 1</option>
<option value="option2">Вариант 2</option>
<option value="option3">Вариант 3</option>
</select><br><br>
<label>Выпадающий список 2:</label>
<select name="dropdown2">
<option value="option1">Вариант 1</option>
<option value="option2">Вариант 2</option>
<option value="option3">Вариант 3</option>
</select><br><br>
<label>Выпадающий список 3:</label>
<select name="dropdown3">
<option value="option1">Вариант 1</option>
<option value="option2">Вариант 2</option>
<option value="option3">Вариант 3</option>
</select><br><br>
<label>PDF файл:</label>
<input type="file" name="pdf_file"><br><br>
<input type="submit" name="submit" value="Отправить">
<input type="hidden" name="action" value="wp_meetings_submit" />
</form>
</div>
<?php
}
?>
А это код в файле functions.php, который должен обрабатывать эту отправку на admin-post.php
// Обработка отправки формы и вставка в базу данных
add_action( 'admin_post_wp_meetings_submit', 'wp_meetings_submit' );
add_action( 'admin_post_nopriv_wp_meetings_submit', 'wp_meetings_submit' );
function wp_meetings_submit(){
global $wpdb;
if(isset($_POST['submit'])){
$datetime = $_POST['datetime'];
$dropdown1 = $_POST['dropdown1'];
$dropdown2 = $_POST['dropdown2'];
$dropdown3 = $_POST['dropdown3'];
$pdf_file = $_FILES['pdf_file']['name'];
$upload_dir = wp_upload_dir();
$pdf_path = $upload_dir['path'] . "https://wordpress.stackexchange.com/" . $pdf_file;
move_uploaded_file($_FILES['pdf_file']['tmp_name'], $pdf_path);
$wpdb->insert(
'wp_meetings',
array(
'datetime' => $datetime,
'dropdown1' => $dropdown1,
'dropdown2' => $dropdown2,
'dropdown3' => $dropdown3,
'pdf_file' => $pdf_file
),
array(
'%s',
'%s',
'%s',
'%s',
'%s'
)
);
}
}
Всё, что я получаю при отправке формы, это белый экран смерти с пустым сообщением об ошибке.
Я настроил WP_DEBUG на true, но при повторной попытке ошибки никакой отладочный журнал не создаётся.
Я хотел узнать, как правильно и полностью это сделать?
Сначала спасибо @TomJNowell за помощь в решении этой проблемы. Я сделал несколько ошибочных предположений, которые значительно усложнили задачу.
Нет необходимости отправлять данные на admin-post, оставляя действие пустым для отправки на текущую страницу, это вполне приемлемо.
Мне кажется, что также нет необходимости добавлять параметр url, который автоматически добавляет WordPress.
Параметры url не отображаются в адресной строке, что заставило меня думать, что они не отправлены. (Предположение) После добавления этого кода в файл:
<?php
if(isset($_POST['submit'])){
echo "Отправка обнаружена!";
print_r($_POST);
}
?>
Я смог увидеть, что данные ввода действительно отправляются, и мне просто нужно взять их с этого момента.
Спасибо ещё раз!
Ответ или решение
Чтобы успешно обработать отправку формы в WordPress через admin-post.php
, необходимо убедиться, что ваша форма правильно настроена, а обработчик формы записан без ошибок. Давайте рассмотрим ваш код и предложим исправления, чтобы избежать "белого экрана смерти" и гарантировать корректную обработку данных.
Шаг 1: Правильная структура формы
Обратите внимание на правильность указания action
в вашей форме. Форму следует отправлять на admin_url('admin-post.php')
, что вы сделали корректно, но убедитесь, что передаётся параметр action
.
Ваш текущий код:
<input type="hidden" name="action" value="wp_meetings_submit" />
Это правильно, так как без этого параметра WordPress не сможет определить, какой обработчик вызывать.
Шаг 2: Проверка обработчика формы
Ваш обработчик формы должен быть корректно зарегистрирован, и код в нем должен быть написан без ошибок. Как вы правильно заметили, ошибки могут не отображаться, но вы можете использовать error_log
, чтобы отслеживать ошибки более эффективно.
Исправленный обработчик:
Вот пример исправленного обработчика формы:
function wp_meetings_submit() {
global $wpdb;
// Проверяем, была ли отправлена форма
if (isset($_POST['submit'])) {
// Получаем данные из формы
$datetime = sanitize_text_field($_POST['datetime']);
$dropdown1 = sanitize_text_field($_POST['dropdown1']);
$dropdown2 = sanitize_text_field($_POST['dropdown2']);
$dropdown3 = sanitize_text_field($_POST['dropdown3']);
// Проверка загрузки файла
if (isset($_FILES['pdf_file']) && !empty($_FILES['pdf_file']['name'])) {
$upload_dir = wp_upload_dir();
$pdf_file = $_FILES['pdf_file']['name'];
$pdf_path = $upload_dir['path'] . '/' . basename($pdf_file);
// Перемещение загруженного файла
if (move_uploaded_file($_FILES['pdf_file']['tmp_name'], $pdf_path)) {
// Вставка данных в базу данных
$wpdb->insert(
'wp_meetings',
array(
'datetime' => $datetime,
'dropdown1' => $dropdown1,
'dropdown2' => $dropdown2,
'dropdown3' => $dropdown3,
'pdf_file' => $pdf_file
),
array('%s', '%s', '%s', '%s', '%s')
);
} else {
// Лог ошибок перемещения
error_log('Ошибка перемещения файла');
}
} else {
error_log('Файл не загружен');
}
// Перенаправление после успешного выполнения
wp_redirect(admin_url('admin.php?page=wp_meetings&success=true'));
exit;
}
}
Замечания по коду:
- Санитизация данных: Используйте функции, такие как
sanitize_text_field()
для очистки входящих данных. - Перенаправление: После завершения обработки лучше перенаправить пользователя, чтобы предотвратить повторную отправку формы, если они обновят страницу.
- Логи ошибок: Я добавил
error_log
для помощи в диагностировании ошибок.
Шаг 3: Включение отладки
Так как у вас уже включен WP_DEBUG
, убедитесь, что у вас также включены следующие параметры в wp-config.php
для отображения ошибок:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
С этими параметрами ошибки будут записываться в файл wp-content/debug.log
, если они возникнут.
Шаг 4: Проверка результатов
После исправления, протестируйте вашу форму. Если все настройки верны, инициируем отправку формы, и в случае успеха, вы должны увидеть перенаправление на страницу со значением success=true
.
Надеюсь, эти советы помогут вам успешно обработать форму в WordPress. Если возникнут дополнительные вопросы, пожалуйста, не стесняйтесь спрашивать!