admin-post.php показывает белый экран после отправки формы

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

Это странная ошибка, потому что раньше этого не было, на самом деле всё работало нормально. Я удалил весь код, который добавил с тех пор, как в последний раз тестировал, и он работал до того, как сломался.

У меня есть пользовательская запись, действующая как страница для отправки формы, и я обрабатываю форму через функцию в файле functions.php в моем плагине.

function tm_add_new_job() {

    if ( empty($_POST) || !wp_verify_nonce($_POST['tm_add_new_job'],'tm_add_new_job') ) {

        wp_nonce_ays();

        die();

    } else {

        $type = $_POST['contacttype'];

        switch ($type) {

            case 'email':

                $title   = $_POST['title'];
                $name    = $_POST['name'];
                $surname = $_POST['surname'];
                $email   = $_POST['email'];

                if (!empty($email)) {

                    // Создать новую запись о работе и клиента
                    $new_customer_id = tm_add_customer($title, $name, $surname);

                    $new_job_id      = tm_add_job($new_customer_id);

                    // Присвоить ссылку на страницу о вас
                    $about_you       = get_page_by_path( 'about-you', '', 'jobs' );

                    $linked          = get_post_permalink($about_you->ID);

                    $secret          = get_post_meta( $new_customer_id, 'customer_secret', true );

                    $link            = $linked .'?customer=". $new_customer_id ."&secret=". $secret;

                    tm_mail_lead($email, $from, $custom, $link);

                    // Добавить ID работы к клиенту
                    add_metadata( "post', $new_customer_id, 'job_id', $new_job_id, false );

                    if (!empty($title)) {

                        // Добавить титул клиента
                        add_metadata( 'post', $new_customer_id, 'customer_title', $title, false );

                    }

                    if (!empty($name)) {

                        // Добавить имя клиента
                        add_metadata( 'post', $new_customer_id, 'customer_name', $name, false );

                    }

                    if (!empty($surname)) {

                        // Добавить фамилию клиента
                        add_metadata( 'post', $new_customer_id, 'customer_surname', $surname, false );

                    }

                    // Добавить email клиента
                    add_post_meta( $new_customer_id, 'customer_email', $email, false );

                } else {

                    // Нет email - ошибка
                    wp_redirect( tm_new_job_link());
                }

                break;

            case 'text':

                $title   = $_POST['sms_title'];
                $name    = $_POST['sms_name'];
                $surname = $_POST['sms_surname'];
                $mobile  = $_POST['mobile'];

                if (!empty($mobile)) {

                    // Создать новую запись о работе и клиента
                    $new_customer_id = tm_add_customer($title, $name, $surname);

                    $new_job_id      = tm_add_job($new_customer_id);

                    // Добавить ID работы к клиенту
                    add_metadata( 'post', $new_customer_id, 'job_id', $new_job_id, false );

                    if (!empty($title)) {

                        // Добавить титул клиента
                        add_metadata( 'post', $new_customer_id, 'customer_title', $title, false );

                    }

                    if (!empty($name)) {

                        // Добавить имя клиента
                        add_metadata( 'post', $new_customer_id, 'customer_name', $name, false );

                    }

                    if (!empty($surname)) {

                        // Добавить фамилию клиента
                        add_metadata( 'post', $new_customer_id, 'customer_surname', $surname, false );

                    }

                    // Добавить мобильный номер клиента
                    add_metadata( 'post', $new_customer_id, 'customer_mobile', $mobile, false );

                } else {

                    // Нет мобильного номера - ошибка
                    wp_redirect( tm_new_job_link());
                }


                break;

            case 'customer':

                $image="quoting.png";

                break;

        }

        if ($_FILES) {

            // Убедитесь, что этот файл включен, так как wp_generate_attachment_metadata() зависит от него.
            require_once(ABSPATH . "wp-admin" . '/includes/image.php');
            require_once(ABSPATH . "wp-admin" . '/includes/file.php');
            require_once(ABSPATH . "wp-admin" . '/includes/media.php');

            $file = $_FILES[featured_image];

            $file_return = wp_handle_upload( $file, array('action' => 'tm_add_new_job' ) );

            if( isset( $file_return['error'] ) || isset( $file_return['upload_error_handler'] ) ) {

              return false;

            } else {

                $filename = $file_return['file'];

                $attachment = array(
                    'post_mime_type' => $file_return['type'],
                    'post_title'     => preg_replace( '/\.[^.]+$/', '', basename( $filename ) ),
                    'post_content'   => '',
                    'post_status'    => 'inherit',
                    'guid' => $file_return['url']
                );

                $attachment_id = wp_insert_attachment( $attachment, $file_return['url'] );

                // Сгенерировать метаданные для вложения и обновить запись в базе данных.
                $attachment_data = wp_generate_attachment_metadata( $attachment_id, $filename );
                wp_update_attachment_metadata( $attachment_id, $attachment_data );

                set_post_thumbnail( $new_job_id, $attachment_id );

            }

        }

        // успех, перейти к новой записи о работе.
        wp_redirect( get_permalink($new_job_id));
    }

}
add_action( 'admin_post_tm_add_new_job', 'tm_add_new_job' );

Для вашего сведения: Форма работает, и данные вставляются в базу данных, единственная проблема в том, что она застряла на пустой (белой странице) admin-post.php. Что я делаю не так?

ОБНОВЛЕНИЕ:

Я обнаружил, что она перенаправляет только если я загружаю изображение?

Проблема была:

if ($_FILES) {}

Может кто-то объяснить это мне? wp_redirect() находится за пределами этого условия, так почему он не перенаправляет? Это потому, что это условие все еще выполнялось, но возникла ошибка из-за того, что файлы не загружались?

Это может быть проблемой:

wp_redirect( tm_new_job_link()); должно быть завершено оператором exit;

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

Причины появления белого экрана после отправки формы в WordPress

Белый экран после отправки формы через admin-post.php — это распространенная проблема в WordPress, и она может быть вызвана множеством факторов. Давайте более детально рассмотрим ваш код и выясним, что может быть не так.

1. Ошибка в обработке файлов

Согласно вашему коду, вы обрабатываете файлы в условии if ($_FILES). Это условие проверяет, есть ли загружаемые файлы. Если загруженных файлов нет, то всё внутри этого блока кода не будет исполняться. В этом случае, если код доходит до wp_redirect(), и если не было ошибок, может произойти ситуация, при которой ничего не будет выполнено, но вы всё равно остаетесь на странице с белым экраном.

2. Необходимость завершения выполнения скрипта

Как вы заметили, вызов wp_redirect() должен быть немедленно завершен вызовом exit;. При вызове wp_redirect() происходит перенаправление, но если не добавить exit;, скрипт продолжает выполняться. Это может привести к нежелательным последствиям, в том числе к попытке вывода данных после заголовков HTTP, что может привести к пустому экрану.

Исправленный код может выглядеть следующим образом:

wp_redirect(get_permalink($new_job_id));
exit;

3. Обработка ошибок и отчёты об ошибках

Для того чтобы лучше понять, что происходит во время выполнения вашего кода, рекомендуется включить отчёт об ошибках. Вы можете сделать это, добавив следующие строки в ваш файл wp-config.php:

define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);

Это приведет к записи всех ошибок в файл debug.log в папке wp-content, что поможет вам идентифицировать проблемы.

4. Проверка значений переменных

Проверьте, что ваши переменные, используемые для выполнения операции, объявлены и инициализированы правильно. Например, $new_job_id, $new_customer_id и т. д. нужно проверить на наличие данных сразу перед их использованием.

5. Возможность существования ошибок в базе данных

Если ваши функции tm_add_customer() или tm_add_job() не работают должным образом и возвращают ошибку (например, если есть проблемы с взаимодействием с базой данных), это может привести к тому, что ваш код будет пытаться выполнить последующие шаги с недействительными значениями. Вам следует также добавить обработку ошибок для этих функций и выводить сообщения об ошибках.

Заключение

Для устранения проблемы с белым экраном после отправки формы, вам необходимо:

  1. Убедиться, что правильный вызов exit; следует за wp_redirect().
  2. Добавить обработку ошибок и включить отладку.
  3. Проверить корректность переменных и функций, которые могут вызвать сбой.
  4. Убедиться, что вы корректно обрабатываете ситуации без загружаемых файлов.

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

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

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