Передача формы для плагинов

16

Я провел много исследований и не нашел именно то, что искал, поэтому я надеюсь, что меня укажут в правильном направлении.

Я разрабатываю плагин Events, который будет бронировать билет с внешнего интерфейса. Это ничем не отличается от любой другой отправки формы, но меня смущает то, как справиться с этим из плагина, написанного через ООП с классом.

В большинстве статей, которые я нашел, говорится, что для обработки $ _POST нужно использовать страницу шаблона. В идеале я хотел бы, чтобы это обрабатывалось функцией в плагине.

Другая вещь, в которой я не уверен, - когда вы отправляете форму на веб-интерфейсе, как она на самом деле передается функции на серверной части. Я надеюсь полностью абстрагировать обработку формы от любых деталей шаблона.

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

Я не уверен, что подключить, чтобы поймать это, или куда отправить действие формы тоже. Спасибо за помощь!

-Адам

alistek
источник
У вас есть более полный пример логики внутри process_form (). Мне интересно знать, какое действие вы вызываете, чтобы убедиться, что отправка вашей формы правильно направлена.
изумруджава

Ответы:

8

Отправьте действие формы на свою домашнюю страницу или на URL конкретной страницы. Вы не можете иметь обработку $ _POST в шаблоне, потому что вам нужно перенаправить после того, как ваш процесс его обработает, и перенаправление должно быть запущено перед любым выводом 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();
    } 

}

Вы также можете проверить одноразовый номер, чтобы убедиться, что данные были отправлены из правильного места ...

onetrickpony
источник
Я подошел очень близко к этому решению, но использовал init вместо template_redirect. Я не думал об использовании перенаправления таким образом, но это делает его намного проще, чем пытаться выяснить, что произошло. Я уже проверяю одноразовый номер, просто нужно установить все формы JS и серверной формы. Спасибо за помощь, я боролся с этим, но теперь это имеет смысл.
alistek