Как сделать свою форму обратной связи для WordPress. Как обрабатывать POST-запросы в wp

Йо-йо! Вам никогда не нужно было создать простую форму в wordpress?! Или вам никогда не становилось интересно как работает Contact Form 7?!

Вот мне стало интересно и даже нужно, когда я делал свой плагин «Зооспас«. В нём я встроил форму т.к. не хотел утяжелять сайты, которые будут на нём работать. И у меня это получилось. Сайт zoospas27.ru имеет время ответа сервера около 120-170мс.

Так как же работать с POST-запросами в WordPress?! Начну сразу с примера — форма.

Создание формы

<form class="form" method="POST" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>">
    <input type="text" name="action" value="action_name"/>
    <!-- Другие инпуты -->
    <button type="submit">Отправить</button>
</form>

esc_url( admin_url(‘admin-post.php’) ) — используем для печати адреса куда wp отправляет все POST-запросы.

С помощью инпута с name=»action» wp определит в какой action отправить данные.

Получение данных

Добавляем обработчики событий для admin_post_(название нашего action из первого input’а) и admin_post_nopriv_(….)

add_action( 'admin_post_action_name', 'custom_action_name' );
add_action( 'admin_post_nopriv_action_name', 'custom_action_name' );

И объявляем функцию, которая будет обрабатывать события, у нас это custom_action_name

function custom_action_name(){
    // Получаем данные из массива $_POST
    $agrs = $_POST;
    // Код обработки функции
}

На этом можно было закончить, но я вам покажу свой пример из плагина «Зооспас».

Пример

add_action( 'admin_post_zoospas_form', 'zoospas_form_action' );
add_action( 'admin_post_nopriv_zoospas_form', 'zoospas_form_action' );
function zoospas_form_action(){
    // Получил данные
    $args = $_POST;
    // Вспомогательный класс для хранения переменных (тут я получаю email админа сайта)
    $to = ZoospasVars::$options['form']['email'];
    // Отчищаю email от лишнего на всякий случай
    $to = sanitize_email($to);
    // Получаю данные из формы
    $subject = $args['subject'];
    $email = $args['email'];
    $phone = $args['tel'];
    // Устанавливаю заголовки письма
    $headers = array(
        'From: Zoospas <info@zoospas.ru>',
        'content-type: text/html; charset=UTF-8',
        'Cc: Zoospas <'. $to  .'',
        'Cc: '. $to
    );
    // Собираю сообщение
    $message = '';
    $message .= '<table>';
    $message .= '<thead><tr><td>' . __('New appeal from the site') . '</td></tr></thead>';
    $message .= '<tbody>';
    $message .= '<tr><td>' . __('Email', 'zoospas') . '</td><td>' . $email . '</td></tr>';
    $message .= '<tr><td>' . __('Phone number', 'zoospas') . '</td><td>' . $phone . '</td></tr>';
    $message .= '</tbody></table>';
    $responce = wp_mail( $to, $subject, $message, $headers );
    // Получаю адрес страницы с которой произошёл запрос
    $addr = $_SERVER['HTTP_REFERER'];
    $addr = str_replace('?zs_mail_responce=true', '', $addr);
    $addr = str_replace('?zs_mail_responce=false', '', $addr);
    // Вспомогательная переменная. В $_GET будет установлена переменная в зависимости от успеха отправки email'а
    $concat = '';
    if($responce == true){
        $concat = '?zs_mail_responce=true';
        header('Location: ' . $addr . $concat);
        exit;
    } else {
        $concat = '?zs_mail_responce=false';
        header('Location: ' . $addr . $concat);
        exit;
    }
}

Вот какая обработка формы у меня получилась. Надею вам будет полезен этот пример

P.S.

Желаю вам удачи в ваших разработках. А если вам интересна судьба бездомных животных помогите организации «Зооспас» или установите плагин zoospas на ваш сайт и начните помогать тем, кто в этом нуждается.

Не забудьте написать комментарий!)