web-dev-qa-db-fra.com

Meilleures pratiques pour la création et la gestion de formulaires avec des plug-ins?

J'écris un plugin qui crée et gère un formulaire simple. Cela a été mon approche douce, mais il s'est avéré avoir quelques défauts majeurs:

1) Lors de l’activation du plug-in, créez une page vierge pour le formulaire sur mysite.com/form et une autre page vierge pour traiter le formulaire sur mysite.com/processform. (Il doit s'agir de pages séparées avec des URL distinctes pour pouvoir suivre les envois via Google Analytics. Sinon, je ferais tout cela via AJAX. Je sais, je sais ... ce n'est pas ma décision.)

2) Sur l'action "wp", vérifiez pour voir sur quelle page nous sommes.

2a) Si c'est ma page de formulaire, ajoutez un filtre "the_content" pour rendre le formulaire (il a besoin d'éléments cachés dynamiques comme un nonce, c'est pourquoi je n'ai pas simplement inclus le balisage du formulaire lorsque j'ai créé la page de formulaire à l'origine).

2b) S'il s'agit de ma page de formulaire de processus, ajoutez un filtre "the_content" pour traiter le POST et restituer tous les commentaires.

Le problème majeur est lié à ma manipulation POST. Je le raccorde au filtre "the_content" (parce que j'en ai besoin pour fournir des informations en retour), mais ce filtre est parfois exécuté plusieurs fois au cours du chargement d'une page, ce qui entraîne le traitement de POST plusieurs fois.

J'ai inclus ce que j'ai ci-dessous, mais je ne peux m'empêcher de penser que ma démarche est complètement fausse. Comment voulez-vous créer et gérer un formulaire avec votre plugin si vous en aviez besoin pour taper une URL de succès (c'est-à-dire pas via AJAX)?

Mon code:

<?php

    // On activation, create the blank pages
    function my_form_install() {

        // CREATE THE FORM PAGE
        $page_markup = '';

        $arr_page_options = array(
            'post_status' => 'publish',
            'post_type' => 'page',
            'post_author' => 1,
            'post_title' => 'Form',
            'post_content' => $page_markup,
            'comment_status' => 'closed'
        );

        // CREATE THE FORM PROCESSING/SUCCESS PAGE
        $success_page_markup = '';

        $arr_success_page_options = array(
            'post_status' => 'publish',
            'post_type' => 'page',
            'post_author' => 1,
            'post_title' => 'Form Process',
            'post_content' => $success_page_markup,
            'comment_status' => 'closed'
        );

    }
    register_activation_hook(__FILE__,'my_form_install');


    // On the wp action, check to see if this is one of our pages. If so, add our filters.
    function check_current_page($obj_wp) {

        if(isset($obj_wp->query_vars["pagename"])) {
            $page_name = $obj_wp->query_vars["pagename"];

            switch($page_name) {

                case "form":
                    add_filter('the_content', 'my_render_form');
                    break;

                case "form-process":
                    add_filter('the_content', 'my_process_form');
                    break;

            }   

        }

    }
    add_action('wp', 'check_current_page');

    // Function to render the form
    function my_render_form($page_markup) {


        $page_markup .= '<form method="post" action="/form-process">
        <input type="text" name="some_input_field" />
        <input type="submit" value="submit" />
        </form>';

        return $page_markup;

    }

    // Function to process the form
    function my_process_form($page_markup) {

        if($_POST) {

            // Do the form processing. This would involve many possible returns, 
            // but I've just included one to simplify thigns.
            $page_markup .= 'Your form has been processed.';

        }

        return $page_markup;

    }

?>
2
MathSmath

Ce n’est qu’un rapide commentaire: utilisez un shortcode pour insérer votre formulaire dans le contenu. Ce sont assez flexibles. Et pour que le formulaire traité ait besoin d'une autre URL, vous pouvez ajouter un point de terminaison de réécriture tel que/formulaire/traité/vous pouvez vérifier après la soumission. C'est probablement plus modulaire.

En fin de compte, cela vous empêche de traiter avec le filtre the_content car vous pouvez traiter n'importe quoi dans le rappel de shortcode.

C'est une suggestion approximative, mais fait probablement le travail pour vous.

2
hakre