Formulario de complemento Presentación de mejores prácticas

16

He investigado mucho y no he encontrado exactamente lo que estoy buscando, así que espero que pueda apuntarme en la dirección correcta.

Estoy desarrollando un complemento de eventos que reservará un ticket desde la interfaz. Esto no es diferente a cualquier otro envío de Formulario, pero con lo que me estoy confundiendo es cómo manejar eso desde un complemento que se escribe a través de OOP con una clase.

La mayoría de los artículos que encontré dicen poner el manejo de $ _POST dentro de la página de la plantilla. Idealmente, me gustaría que esto fuera manejado por una función dentro del complemento.

La otra cosa de la que no estoy seguro es cuando envía el formulario en la interfaz, cómo se pasa eso a la función en el back-end. Espero abstraer completamente el procesamiento del formulario a partir de los detalles de la plantilla.

// 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...
}

No estoy seguro de en qué conectar eso atraparía eso, o dónde enviar la acción del formulario también. ¡Gracias por toda la ayuda!

-Adán

alistek
fuente
¿Tiene un ejemplo más completo de la lógica dentro de process_form (). Me interesa saber qué acción llama para asegurarse de que el envío de su formulario se enruta correctamente.
emeraldjava

Respuestas:

8

Envíe la acción del formulario a su página de inicio o a una URL de página específica. No puede tener el manejo de $ _POST dentro de la plantilla porque necesita redirigir después de su proceso, y la redirección debe dispararse antes de cualquier salida 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();
    } 

}

También puede verificar si hay un nonce para asegurarse de que los datos se enviaron desde el lugar correcto ...

Pony de un solo truco
fuente
Me había acercado mucho a esa solución pero estaba usando init en lugar de template_redirect. No pensé en usar la redirección de esa manera, pero hace que sea mucho más simple que tratar de descubrir lo que sucedió. Ya estoy buscando el nonce, solo tengo que tener todo el formulario JS y la validación del formulario del lado del servidor en su lugar. Gracias por la ayuda, había luchado con esto, pero ahora tiene sentido.
alistek