- Вопрос или проблема
- Ответ или решение
- Причины появления белого экрана после отправки формы в WordPress
- 1. Ошибка в обработке файлов
- 2. Необходимость завершения выполнения скрипта
- 3. Обработка ошибок и отчёты об ошибках
- 4. Проверка значений переменных
- 5. Возможность существования ошибок в базе данных
- Заключение
Вопрос или проблема
Это странная ошибка, потому что раньше этого не было, на самом деле всё работало нормально. Я удалил весь код, который добавил с тех пор, как в последний раз тестировал, и он работал до того, как сломался.
У меня есть пользовательская запись, действующая как страница для отправки формы, и я обрабатываю форму через функцию в файле 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()
не работают должным образом и возвращают ошибку (например, если есть проблемы с взаимодействием с базой данных), это может привести к тому, что ваш код будет пытаться выполнить последующие шаги с недействительными значениями. Вам следует также добавить обработку ошибок для этих функций и выводить сообщения об ошибках.
Заключение
Для устранения проблемы с белым экраном после отправки формы, вам необходимо:
- Убедиться, что правильный вызов
exit;
следует заwp_redirect()
. - Добавить обработку ошибок и включить отладку.
- Проверить корректность переменных и функций, которые могут вызвать сбой.
- Убедиться, что вы корректно обрабатываете ситуации без загружаемых файлов.
Эти шаги помогут вам диагностировать и исправить проблемы с белым экраном, а также улучшить стабильность вашего кода в будущем.