Zgłoszenie formularza wtyczki Najlepsze praktyki

16

Przeprowadziłem wiele badań i nie znalazłem dokładnie tego, czego szukam, więc mam nadzieję, że uda mi się wskazać właściwy kierunek.

Rozwijam wtyczkę Wydarzenia, która zarezerwuje bilet z interfejsu użytkownika. Nie różni się to niczym od innych formularzy, ale mylę się z tym, jak sobie z tym poradzić z wtyczki napisanej przez OOP z klasą.

Większość artykułów, które znalazłem, mówi o umieszczeniu obsługi $ _POST na stronie szablonu. Idealnie chciałbym, aby była obsługiwana przez funkcję we wtyczce.

Inną rzeczą, o której nie jestem pewien, jest przesłanie formularza na interfejsie, w jaki sposób przekazuje się go do funkcji na interfejsie. Mam nadzieję całkowicie oddzielić przetwarzanie formularza od jakichkolwiek szczegółów szablonu.

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

Nie jestem pewien, w co się w to złapać, ani gdzie wysłać formularz. Dzięki za wszelką pomoc!

-Adam

alistek
źródło
Czy masz pełniejszy przykład logiki wewnątrz process_form (). Chcę wiedzieć, jakie działanie wywołujesz, aby upewnić się, że przesłanie formularza jest prawidłowe.
emeraldjava

Odpowiedzi:

8

Wyślij akcję formularza na swoją stronę główną lub na określony adres URL strony. W szablonie nie możesz obsługiwać $ _POST, ponieważ musisz przekierować po przetworzeniu, a przekierowanie musi zostać uruchomione przed wyjściem 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();
    } 

}

Możesz także sprawdzić nonce aby upewnić się, że dane zostały przedstawione z odpowiednim miejscu ...

onetrickpony
źródło
Podszedłem bardzo blisko tego rozwiązania, ale użyłem init zamiast template_redirect. Nie myślałem o użyciu przekierowania w ten sposób, ale to sprawia, że ​​jest to o wiele prostsze niż próbowanie odgadnięcia, co się stało. Już sprawdzam nonce, po prostu muszę wprowadzić całą weryfikację formularza JS i weryfikację formularza po stronie serwera. Dzięki za pomoc, walczyłem z tym, ale teraz ma to sens.
alistek