ti-enxame.com

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

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

Eu criei um plugin 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 carregam como admin.php?page=..., a menos que eu queira carregá-las diretamente do diretório do plugin, o que eu 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 fizer um GET ou POST, realmente.

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

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

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 possa acessar do lado de fora.

Então, após esta longa história ... alguém chegou a uma boa solução para carregar outra página através de um callback sem com toda a interface de administração 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.

21
wyrfel

Como regra geral, você deve usar uma solicitação POST para a maioria das ações, para garantir que elas não sejam executadas 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 envia para
  2. Uma página que manipula a solicitação, que redireciona para
  3. Sua página de plugins, que mostra o resultado da ação

A página do meio não precisa ser sua página de plugin. Isso significa que você pode usar o "genérico POST manipulador" que foi incluído há três anos, o gancho 'admin_action_' . $_REQUEST['action'] 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 por acaso 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
}
28
Jan Fabry

Eu 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 então executa a ação (ou seja, normalmente adicionar, atualizar ou excluir) e finaliza com uma ação wp_redirect () na próxima página (por exemplo, adicionar página -> editar página, excluir página -> listar página, editar página -> editar página ). Também transmito uma mensagem no URL para poder 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.

3
Russell Jamieson

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

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

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

0
simonthesorcerer