Вопрос или проблема
Я разрабатываю плагин. Здесь я хотел бы перенаправить на страницу всех пользовательских записей после сохранения пользовательской записи. Мой код выглядит следующим образом.
add_action( 'save_post', [ $this, 'save_meta_values' ] );
public function save_meta_values( $post_id )
{
//дополнительный код здесь
return $post_id; // Я хотел бы перенаправить здесь
}
Как я могу перенаправить на страницу всех записей, как wp_redirect( admin_url( 'edit.php?post_type=news_info' ) );
?
Возможно, я не смог правильно выразить свои мысли.
Ответ или решение
Чтобы реализовать редирект на страницу всех пользовательских постов после сохранения нового поста в вашем плагине WordPress, вы можете использовать хук save_post
и функцию wp_redirect()
. Однако следует помнить о некоторых важных моментах, связанных с обработкой редиректов в WordPress, особенно в контексте сохранения.
Проблема редиректа в обработчике save_post
Когда выполняется хук save_post
, пользователь может перегружать страницу, что может привести к неправильному состоянию и потенциальным ошибкам. В WordPress редирект следует выполнять с помощью отдельного механизма, так как вызов wp_redirect
в функции сохранения может не сработать должным образом.
Рекомендации по реализации
Чтобы корректно реализовать редирект на нужную страницу, следуйте следующему шагу:
-
Используйте
add_action
для хукаsave_post
для обработки сохранения метаполей и выполнения действий после сохранения поста. -
Вместо непосредственного редиректа в функции
save_meta_values
, сохраните информацию о необходимости редиректа в пользовательские метаданные или глобальные переменные. -
Затем, используя хук
admin_notices
илиadmin_init
, проверьте, требуется ли редирект, и выполните его.
Пример кода
Вот пример того, как вы можете реализовать данное решение:
add_action( 'save_post', [ $this, 'save_meta_values' ] );
public function save_meta_values( $post_id ) {
// Ваша логика сохранения метаполей
// ...
// Сохраняем информацию о редиректе
update_post_meta( $post_id, '_redirect_after_save', true );
}
add_action( 'admin_init', 'redirect_after_post_save' );
function redirect_after_post_save() {
if ( isset( $_REQUEST['post'] ) ) {
$post_id = intval( $_REQUEST['post'] );
// Проверяем, нужно ли делать редирект
$redirect = get_post_meta( $post_id, '_redirect_after_save', true );
if ( $redirect ) {
delete_post_meta( $post_id, '_redirect_after_save' ); // Удаляем метаданные после использования
wp_redirect( admin_url( 'edit.php?post_type=news_info' ) );
exit; // Завершаем выполнение, чтобы не было дальнейших выводов
}
}
}
Пояснения к коду
-
Сохранение метаданных: После сохранения поста мы сохраняем метаданные, которые указывают, что требуется редирект.
-
Хук
admin_init
: Здесь мы проверяем, есть ли запрашиваемый идентификатор поста и необходим ли редирект по метаданным. -
Редирект: Если метаданные подтверждают необходимость редиректа, выполняется вызов функции
wp_redirect
. -
exit
: Это критически важный момент — после редиректа необходимо завершить выполнение сценария, чтобы предотвратить возможные ошибки или дополнительные выводы на страницу.
Заключение
Используя этот метод, вы сможете безопасно и эффективно реализовать перенаправление после сохранения вашего пользовательского поста в WordPress. Эта практика не только улучшит пользовательский интерфейс вашего плагина, но и позволит избежать потенциальных ошибок, связанных с двойными обращениями к базе данных и нежелательными последствиями при обновлении страниц.