wp_redirect не работает после отправки формы
Я использую этот редирект после создания поста. Он не работает, просто обновляет страницу с формой. Я знаю, что $pid получает ID поста, так в чем проблема? Это самый конец моего php-кода для обработки отправки формы.
$pid = wp_insert_post($new_post);
update_post_meta($pid,'domain',$domain);
update_post_meta($pid,'keywords',$keywords);
wp_redirect( get_permalink($pid) );
exit();
При использовании плагина Better HTTP Redirects вывод такой, и слово here
ведет на корректно опубликованный пост.
302 Found
The document has moved here.

Вы можете использовать wp_redirect
только до того, как контент будет отправлен в браузер. Если включить отладку PHP, вы увидите ошибку "headers already sent" из-за вызова get_header()
в первой строке.
Вместо обработки формы в шаблоне, вы можете использовать более ранний хук, такой как wp_loaded
, и сэкономить несколько запросов к базе данных, если собираетесь перенаправить пользователя.
РЕДАКТИРОВАНО, пример:
add_action( 'wp_loaded', 'wpa76991_process_form' );
function wpa76991_process_form(){
if( isset( $_POST['my_form_widget'] ) ):
// обрабатываем форму, затем
wp_redirect( get_permalink( $pid ) );
exit();
endif;
}
Используя хук, вы можете держать код отдельно от шаблонов. Объедините это с шорткодом для вывода формы и оберните всё в класс, чтобы сохранять состояние между обработкой и выводом — тогда можно обойтись без изменений фронтенд-шаблонов.

@Miloe да, я только что увидел сообщение "headers already sent" при включенном режиме отладки и плагине better http redirect. Я не знаком с использованием хуков, не могли бы вы указать на какой-то учебник или показать пример кода, пожалуйста

Спасибо, значит вы предлагаете поместить форму в шорткод, а затем использовать do_shortcode() в шаблоне для отображения формы. Хук должен быть добавлен в мой functions.php. Каким должно быть действие формы, чтобы вызвать функцию/хук?

вам не пришлось бы использовать do_shortcode
, я хотел сказать, что вы можете добавить форму через шорткод в контент записи/страницы, тогда вся ваша обработка и код рендеринга будут отделены от шаблона. Таким образом, форма сможет работать на любой странице, куда вы поместите шорткод формы в контенте. Действие может просто указывать на текущую страницу с помощью #
или быть пустым, поскольку вы перехватываете все запросы, чтобы проверить, была ли отправлена ваша форма, это будет работать с любой страницы.

Перемещение get_header();
в конец кода должно решить проблему. Ваш код выполнится до отправки каких-либо заголовков, и редирект будет работать.
// ...
wp_redirect( get_permalink($pid) );
exit();
// вставка таксономий
}
get_header(); ?>
Я предполагаю, что на странице есть ещё код ниже того, что вы показали? Если нет, то я не вижу необходимости в get_header()
вообще.
Единственное преимущество использования хука, как предлагает Мило, заключается в том, что вы можете избежать некоторой нагрузки, если выберете достаточно ранний хук. Это может сократить время обработки на доли секунды.

Да, здесь есть немного HTML и дополнительные WordPress-функции, такие как get_sidebars() и get_footer() и т.д. Я совершенно не знаком с использованием хуков, но очень хотел бы увидеть пример. Я уже гуглю и вижу, как люди обсуждают add_action('wp_loaded', 'your_function')
, но не совсем понимаю, как это использовать. Буду благодарен за любые примеры, спасибо.

Я подожду немного и посмотрю, опубликует ли @Milo пример с использованием хука, так как это его ответ. Если нет, я отредактирую свой ответ.

Спасибо, перемещение get_header() ниже кода обработки формы и редирект сработали. Но я бы всё равно хотел увидеть, как использовать хук.
