Prática recomendada para envio de formulário de plug-in

16

Pesquisei bastante e não encontrei exatamente o que estou procurando, por isso espero poder ser apontado na direção certa.

Estou desenvolvendo um plug-in de eventos que reserva um ticket pelo front-end. Isso não é diferente de qualquer outro envio de formulário, mas o que estou confundindo é como lidar com isso a partir de um plug-in que é escrito via OOP com uma classe.

A maioria dos artigos que encontrei dizem colocar a manipulação $ _POST na página do modelo. Idealmente, eu gostaria de ter isso tratado por uma função dentro do plugin.

A outra coisa que não tenho certeza é quando você envia o formulário no front-end, como isso realmente é passado para a função no back-end. Espero abstrair completamente o processamento do formulário a partir de qualquer detalhe do modelo.

// events.php
if ( ! class_exists( 'Events' ) ) {

    Class Events {
        function __construct() {
            add_action( 'plugins_loaded', array( &$this, 'includes' ), 1 );
        }

        function includes() {
            require_once( EVENTS_INCLUDES . 'functions.php' );
        }
    }
}

if ( class_exists( 'Events' ) ) {
    $events_load = New Events();
}


// functions.php
function process_form() {
    ...do form processing here...

    ...insert booking...
}

Não sei ao certo o que fazer para capturar isso ou para onde enviar a ação do formulário também. Obrigado por toda a ajuda!

-Adão

Alistek
fonte
Você tem um exemplo mais completo da lógica dentro de process_form (). Estou interessado em saber qual ação você chama para garantir que o envio do seu formulário seja roteado corretamente.
Emeraldjava 31/07/2013

Respostas:

8

Envie a ação do formulário para sua página inicial ou para um URL de página específico. Você não pode ter a manipulação $ _POST no modelo porque precisa redirecionar após o processo e o redirecionamento precisa ser acionado antes de qualquer saída HTML.

// you should choose the appropriate tag here
// template_redirect is fired just before any html output
// see - http://codex.wordpress.org/Plugin_API/Action_Reference
add_action('template_redirect', 'check_for_event_submissions');

function check_for_event_submissions(){
  if(isset($_POST['event'])) // && (get_query_var('pagename') === 'events) 
    {
       // process your data here, you'll use wp_insert_post() I assume

       wp_redirect($_POST['redirect_url']); // add a hidden input with get_permalink()
       die();
    } 

}

Você também pode verificar se há um nonce para garantir que os dados foram enviados do lugar certo ...

onetrickpony
fonte
Eu tinha chegado muito perto dessa solução, mas estava usando init em vez de template_redirect. Não pensei em usar o redirecionamento dessa maneira, mas torna muito mais simples do que tentar descobrir o que aconteceu. Eu já estou verificando o nonce, só preciso obter toda a validação do formulário JS e do formulário do lado do servidor. Obrigado pela ajuda, eu tinha lutado com isso, mas está fazendo sentido agora.
Alistek