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

8

O livro Professional WordPress Plugin Development explica em detalhes como usar adequadamente a API de configurações e também demonstra como adicionar menus e submenus, mas, infelizmente, não fornece exemplos disso. Embora tenha conseguido que a maior parte funcione, não consigo descobrir como implementar adequadamente 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 renderizadas add_menu_page.

jnthnclrk
fonte

Respostas:

8

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

  1. add_settings_error()chamada para adicionar item à pilha ( $wp_settings_errorsvariável global ).
  2. settings_errors transitório que mantém os erros para que eles sobrevivam, movem-se de uma página para outra.
  3. settings_errors()função get_settings_errors()para recuperar erros de memória ou transitória e exibe então eles.

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

Conecte-se settings_errors()à admin_noticespágina do seu plug-in e passe o código de erro para que ele mostre apenas o seu material.

Salve manualmente os erros como settings_errorstransitórios (apenas itens dessa variável global).

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

Atualizar

Você está transformando isso em uma bagunça com várias perguntas, então tentarei abordar suas preocupações aqui.

API de configuração faz o trabalho com páginas de administração, que não usam seção Configurações como base. Seu problema real é que, nesse caso, os relatórios de erro / aviso não funcionam.

Primeiro, veja o que acontece quando você publica um formulário, configurado com a API de configurações:

  1. Os dados são publicados em uma options.phppágina especial .
  2. Os dados são limpos / validados usando retorno de chamada.
  3. Quaisquer erros / avisos surgidos durante a higienização / validação são coletados e salvos em transitório.
  4. Você é redirecionado de volta para onde você veio .

Agora, quando você carrega a página de administrador, ela verifica se essa página pertence à seção Configurações e se esse caso inclui um options-head.phparquivo minúsculo , que trata da 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 para se fazer com a visão geral da função relacionada acima (eu provavelmente entrei em muitos detalhes sobre transientes, você não precisará disso para o caso básico).

Rarst
fonte
Você está dizendo que a API de configurações não foi realmente projetada para uso em menus e telas de administrador?
Jnthnclrk
@trnsfrmr bem, não é o meu lugar para dizer se foi ou não foi projetado , mas certamente não está configurado para isso de forma nativa.
Rarst
Porra, eu entendi completamente errado então. Portanto, a API de configurações é apenas para telas que vivem no item de menu Configurações? Em retrospectiva, isso explica por que usá-lo em menus personalizados tem sido tão complicado.
Jnthnclrk
Parece uma pena que todos os recursos interessantes da API de configurações não estejam disponíveis para plugins usando menus personalizados.
Jnthnclrk
@trnsfrmr bem você ainda pode tentar fazer uso dele, apenas preciso esforço extra gasto
Rarst
0

Um pouco tarde, 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 de administrador às páginas de administrador renderizadas usando add_menu_page

Bev
fonte
-1

Simplesmente adicionando

include_once 'options-head.php'; 

para a função $ da minha página de menu personalizada parecia funcionar bem para exibir as mensagens de erro nas páginas de menu personalizadas.

James Smartt
fonte