Como exibir um aviso de administrador após atualizar as configurações do plugin?

Eu tenho um plugin com uma página de configuração, e há algumas ações que precisam ser feitas quando uma certa opção é salva. Estou usando o pre_update_option_ hook para fazer isso. Por enquanto, tudo bem. Se algo der errado, no entanto, eu também precisarei notificar isso ao usuário. Eu tentei essas coisas:

1) Adicionar gancho para admin_notices antes de atualizar o código

 add_action ('pre_update_option_my_var', function( $new_value, $old_value) { //Do my validation $valid = ( 'correct_value' == $new_value ); if ( !$valid ) add_action('admin_notices', 'my_notification_function' ) return ($valid)? $new_value : $old_value; }); 

A validação funciona, mas a notificação não é exibida porque, eu suponho, até então as funções conectadas aos admin_notices já foram executadas?

2) Validação na function enganchada para admin_notices Para resolver o problema acima, tive essa ideia.

 add_action('admin_notices', function () { //Do my validation $valid = ( 'correct_value' == $_POST['my_var'] ); if (!$valid) { /* Display error message */ } //Store the value of $valid }); add_action ('pre_update_option_my_var', function( $new_value, $old_value) { //fetch the value of $valid which I stored return ($valid)? $new_value : $old_value; }); 

Agora, isso parece funcionar bem, eu vejo a notificação agora. O problema é que, por algum motivo estranho, não vejo os valores postados. Tentei imprimir $_POST e sempre vazio! Provavelmente o WordPress está passando os valores de alguma outra forma? Em caso afirmativo, como?

Qual é o caminho certo, e como posso resolver o problema? Claro, se qualquer outro método for melhor do que esses dois e resolva o problema, é bem-vindo.

Solutions Collecting From Web of "Como exibir um aviso de administrador após atualizar as configurações do plugin?"

Depois de cavar na API de configuração, encontrei a resposta. O método 1 estava correto, mas a notificação não deve ser feita conectando-se a admin_notices , e sim pela function add_settings_error

 add_action ('pre_update_option_my_var', function( $new_value, $old_value) { //Do my validation $valid = ( 'correct_value' == $new_value ); if ( !$valid ) { //This fixes the issue add_settings_error( 'my_var', $error_code, $message ); } return ($valid)? $new_value : $old_value; }); 

Para exibi-los, isso também precisa ser adicionado no início da página de configurações:

 

The heading of my settings page

< ?php settings_errors(); ?>

Não, você está fazendo errado. add_action deve estar em __construct() do seu object de plugin. Aqui está o trecho do meu pequeno plugin WOOF por Categoria , você pode descarregar todo o código do wordpress.org:

 public function __construct() { //... add_action( 'admin_notices', array( $this, 'wbc_plugin_not_found' ) ); //... } 

No meu código, verifico uma condição (validação – no seu caso) e retorna o resultado via wbc_requirements_met() . Se o resultado for falso, eu adiciono uma mensagem de notificação com wbc_admin_message

 public function wbc_plugin_not_found() { if ( $this->wbc_requirements_met() ) { return; } $message = __( 'WOOF by Category plugin requires the following plugins installed and activated: ', 'woof-by-category' ); //... $this->wbc_admin_message( $message, 'error notice is-dismissible' ); } private function wbc_admin_message( $message, $class ) { ?> 

< ?php echo wp_kses( $message, wp_kses_allowed_html( 'post' ) ); ?>

< ?php }

Eu enfrento esse mesmo desafio há alguns meses atrás. Eu precisava mostrar avisos de administrador com base em certas validações que eu tinha com alguns campos personalizados em um tipo de postagem personalizado.

Como minha validação estava em um gancho pre_save, o problema é que “o navegador atualiza depois que o gancho triggers”.

Então encontrei uma aula de John Oleksowicz que, basicamente, armazena os avisos de administrador na tabela de opções e limpa quando não é necessário.

É chamado de: Notificações fáceis do WordPress Admin

A class é bastante direta e você pode usar o plugin. No meu caso, usei a aula e a adaptei alterando a maneira de chamar as funções das mensagens de administração.

Então, agora, sempre que eu preciso desencadear uma notificação de administrador, eu apenas faço:

 planner_notices_add_error( $message );