it-swarm-pt.tech

Como se deve implementar o add_settings_error em páginas de menu personalizadas?

O Professional WordPress Plugin Development livro explica em detalhes como usar corretamente a API de configurações, e também demonstra como adicionar menus e submenus, mas infelizmente não fornece nenhum exemplo conjunto disto. Embora eu tenha conseguido obter a maior parte do tempo trabalhando, não consigo descobrir como implementar adequadamente o add_settings_error em páginas de menu personalizadas. Aqui está o meu código:

function settings_main_validate( $input ) {
$valid['text_string'] = preg_replace( '/[^a-zA-Z]/', '', $input['text_string'] );

if ( $valid['text_string'] != $input['text_string'] ) {
    //add_setting_error: $title, $id, $error_message, $class
    add_settings_error( 'fields_main_input', 'texterror', 'Incorrect value entered!', 'error' );
}   

return $valid;
}                  

A validação acima funcionará muito bem na configuração renderizada usando add_options_page, mas não exibirá os erros de configuração nas páginas processadas com add_menu_page.

8
jnthnclrk

Existem vários componentes para criação de erros/avisos e processo de exibição:

  1. add_settings_error() call para adicionar um item à pilha (global $wp_settings_errors variable).
  2. settings_errors transitório que mantém os erros para que eles sobrevivam de uma página para outra.
  3. settings_errors() function get_settings_errors() para recuperar erros da memória ou transiente e, em seguida, os exibe.

Estes funcionam como um encanto para a API de configurações, mas infelizmente eles não são configurados para uso genérico. Por outro lado, é trivial para contornar isso.

Conecte settings_errors() a admin_notices na página do seu plugin, passe o código de erro para que ele mostre apenas seus dados.

Manualmente, salve os erros no settings_errors transitório (apenas insira nela a variável global).

Como get_settings_errors() espera dica nos parâmetros GET ($_GET['settings-updated']) que deve verificar transiente em vez de memória, você pode fornecer isso ou obter erros de transiente e salvá-los de volta à variável global antes de sua chamada settings_errors().

Atualizar

Você está transformando isso em uma bagunça com várias perguntas, por isso vou tentar resolver suas preocupações aqui.

API de configurações faz trabalha com páginas de administração, que não usam a seção Configurações como base. Seu problema real é que, nesse caso, o relatório de erros/avisos não funciona.

Primeiro, aqui está o que acontece quando você postar um formulário, configurar com a API de configurações:

  1. Os dados são publicados na página especial options.php.
  2. Os dados são limpos/validados usando o retorno de chamada.
  3. Quaisquer erros/avisos que surgiram durante a sanitização/validação são coletados e salvos em transientes.
  4. Você é redirecionado de volta para de onde você veio .

Agora, quando você carrega a página de administração, ele verifica se esta página pertence à seção Configurações e se esse caso inclui o pequeno arquivo options-head.php, que lida com a recuperação e exibição de avisos de erros.

Portanto, a única coisa que "não funciona" em outras páginas é este último passo, que é trivial fazer com a visão geral da função relacionada acima (eu provavelmente entrei em muitos detalhes sobre transitórios, você não precisará disso para o caso básico).

8
Rarst

Um pouco atrasado, mas acabei de passar por isso. Com base no código do OP, a melhor solução que encontrei é inserir este código:

function your_admin_notices_action() {
    settings_errors( 'fields_main_input' );
}
add_action( 'admin_notices', 'your_admin_notices_action' );

Isso adicionará a exibição do aviso administrativo às páginas administrativas renderizadas usando add_menu_page

0
Bev