Отправка формы на admin-post.php в WordPress

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

Отправка формы на 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;
    }
}

Замечания по коду:

  1. Санитизация данных: Используйте функции, такие как sanitize_text_field() для очистки входящих данных.
  2. Перенаправление: После завершения обработки лучше перенаправить пользователя, чтобы предотвратить повторную отправку формы, если они обновят страницу.
  3. Логи ошибок: Я добавил 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. Если возникнут дополнительные вопросы, пожалуйста, не стесняйтесь спрашивать!

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

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