Отображение «Одноразового» уведомления в плагинах

В бэкэнд WordPress вы можете добавлять уведомления и ошибки с помощью HTML, который выглядит так:

<div class="updated error"> <p><?php esc_html_e( 'A bad thing happened!', 'your-text-domain' );?></p> </div> 

Вы можете добавить эти уведомления, используя admin_notices .

 add_action( 'admin_notices', function(){ ?> <div class="updated error"> <p><?php esc_html_e( 'A bad thing happened!', 'your-text-domain' );?></p> </div> <?php } ); 

Есть ли у WordPress механизм, или существует ли «обычная практика» в отношении сторонних производителей, которая позволит вам установить уведомление «один раз»? Сценарий, о котором я думаю,

  1. Пользователь отправляет форму
  2. Для обработки кода делает вещи, уведомляет пользователя
  3. Загрузка новой страницы с уведомлением
  4. Если пользователи перезагружаются или переадресовываются на страницу (кнопка «Назад»), сообщение не отображается снова

Другие прикладные структуры, которые я использовал, имеют абстракцию сеанса для обработки таких вещей. Мне любопытно, есть ли у WordPress что-то подобное, или если есть общепринятый способ сделать это, или если плагины WordPress Just Do not Do This ™.

Идея состоит в том, что вам нужно save_errors или обновить параметр, который имеет ошибки / уведомления, когда захотите. Как только его вывод один раз admin_notices будет очищен.

 /** * Sample_Notice_Handling */ class Sample_Notice_Handling { public static $_notices = array(); /** * Constructor */ public function __construct() { add_action( 'admin_notices', array( $this, 'output_errors' ) ); add_action( 'shutdown', array( $this, 'save_errors' ) ); } /** * Add an error message */ public static function add_error( $text ) { self::$_notices[] = $text; } /** * Save errors to an option */ public function save_errors() { update_option( 'custom_notices', self::$_notices ); } /** * Show any stored error messages */ public function output_errors() { $errors = maybe_unserialize( get_option( 'custom_notices' ) ); if ( ! empty( $errors ) ) { echo '<div id="mc_errors" class="error notice is-dismissible">'; foreach ( $errors as $error ) { echo '<p>' . wp_kses_post( $error ) . '</p>'; } echo '</div>'; // Clear delete_option( 'custom_notices' ); } } }