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
.
Existem vários componentes para criação de erros/avisos e processo de exibição:
add_settings_error()
call para adicionar um item à pilha (global $wp_settings_errors
variable).settings_errors
transitório que mantém os erros para que eles sobrevivam de uma página para outra.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:
options.php
.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).
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