Como faço para lidar melhor com ações de páginas de plug-in personalizadas?

21

Estou constantemente com o mesmo aborrecimento, então pensei em ver se há alguma ideia ou experiência lá fora ...

Eu criei um plug-in que usa sua própria página de administração. Tem que ser. Agora que eu resolvi o material WP_List_Table (), devo dizer que é ótimo ... mas ....

As páginas de plug-in personalizadas sempre são carregadas como admin.php?page=... , a menos que eu queira carregá-las diretamente do diretório do plug-in, o que não faço. Agora, se eu fizer uma 'ação' a partir dessa página, eu preciso processar de alguma forma e, em seguida, redirecionar de volta para a página sem o parâmetro de ação. Não importa se eu faço um GET ou POST, realmente.

Em todas as suas páginas internas, o WP faz isso na mesma página, ele verifica se há uma ação, se assim for, a processa e depois redireciona para si mesma sem a ação. Isso é possível, porque nessas páginas o admin-header ainda não foi carregado.

Se você tentar fazer isso em sua própria página, no entanto, metade da interface do administrador já foi enviada para o navegador, portanto, um redirecionamento não é mais possível. Claramente, a solução é POST / GET diretamente para outra página, carregar a estrutura do WP sobre isso, fazer o processamento e então redirecionar de volta para a página original ... mas ... isso é um pouco chato, porque ... meu original página é carregada através de um retorno de chamada, por isso é executado dentro de um método da minha classe. Isso é lindo.

Se eu carregar uma página separada, eu tenho que incluir manualmente wp-load.php e estou fora da minha classe, o que é chato, e no meu caso particular me incomoda especialmente, porque eu estou apenas instanciando minha classe de plugin anonimamente para que ninguém pode acessá-lo do lado de fora.

Então, após essa longa história ... alguém encontrou uma boa solução para carregar outra página por meio de um retorno de chamada sem ter toda a interface administrativa já configurada em torno dele?

(Eu sei de uma solução alternativa ... Eu posso ligar uma função em load-.... que verifica o parâmetro de ação e faz o processamento e redirecionamento. Mas eu estou querendo saber se há uma maneira melhor.)

Obrigado.

    
por wyrfel 26.02.2011 / 01:44
fonte

3 respostas

28

Como regra geral, você deve usar uma solicitação POST para a maioria das ações, para garantir que elas não sejam executado por acidente . Mas também é uma boa prática redirecionar para uma página normal após uma solicitação POST, para impedir a execução duplicada quando o usuário atualizar a página.

Então o fluxo é assim:

  1. Sua página de plug-in com um formulário POST, que é enviado para
  2. Uma página que lida com a solicitação, que redireciona para
  3. Sua página de plug-in, que mostra o resultado da ação

A página do meio não precisa ser sua página de plug-in. Isso significa que você pode usar o "manipulador POST genérico" que foi incluído há três anos, o 'admin_action_' . $_REQUEST['action'] hook em admin.php .

Um exemplo de usuário é o plugin Akismet . Se você quiser usá-lo de forma confiável, você tem que enviar para admin.php diretamente , não para outra página que inclua admin.php .

Aqui está um exemplo muito básico de como usá-lo:

add_action( 'admin_action_wpse10500', 'wpse10500_admin_action' );
function wpse10500_admin_action()
{
    // Do your stuff here

    wp_redirect( $_SERVER['HTTP_REFERER'] );
    exit();
}

add_action( 'admin_menu', 'wpse10500_admin_menu' );
function wpse10500_admin_menu()
{
    add_management_page( 'WPSE 10500 Test page', 'WPSE 10500 Test page', 'administrator', 'wpse10500', 'wpse10500_do_page' );
}

function wpse10500_do_page()
{
?>
<form method="POST" action="<?php echo admin_url( 'admin.php' ); ?>">
    <input type="hidden" name="action" value="wpse10500" />
    <input type="submit" value="Do it!" />
</form>
<?php
}
    
por Jan Fabry 28.02.2011 / 22:08
fonte
3

Abordei isso de forma ligeiramente diferente simplesmente adicionando noheader = true ao URL de ação na página em que o usuário envia a ação

Meu manipulador executa a ação (ou seja, normalmente adiciona, atualiza ou exclui) e finaliza com uma ação wp_redirect () na próxima página (por exemplo, página de adição - > página de edição, página de exclusão - > página - > página de edição). Também transmito uma mensagem no URL para exibir um status como atualização ou falha.

Essa abordagem mantém todas as ações: listar, adicionar, editar, excluir, excluir em massa, etc na mesma classe e com o mesmo slug admin, então é muito fácil manter e entender.

    
por Russell Jamieson 29.08.2011 / 14:22
fonte
0

Outra abordagem diferente é apenas adicionar um campo de entrada oculto ao formulário:

<input type="hidden" name="page" value="your-page-slug" />

Dessa forma, o WordPress parece lidar com o redirecionamento automaticamente.

    
por simonthesorcerer 16.01.2015 / 17:02
fonte