web-dev-qa-db-fra.com

Form Shortcode ne pas enregistrer les données dans WP base de données

Je développe un plugin qui crée une table personnalisée lors de l'activation du plugin. Le plugin permet aux utilisateurs d'ajouter un shortcode de formulaire afin de collecter des données pour les pistes.

J'ai atteint le point où les données sont sauvegardées mais je ne peux pas créer de nouveau message (les "en-têtes déjà envoyés" seront obtenus lorsque le bouton de publication sera cliqué dans l'éditeur WP) ou , Je suis capable de créer un nouveau message, le formulaire s’affiche via un shortcode MAIS les données ne sont pas sauvegardées dans la base de données.

Je me suis tiré les cheveux pour essayer de comprendre ce que je faisais mal.

Toute aide dans la bonne direction serait grandement appréciée.

Voici le code de processus de formulaire.

    //Process form data
function el_process_form(){

if (isset($_POST['everlead'])) {

    if( $_SERVER['REQUEST_METHOD'] == 'POST' && !empty( $_POST['post_type'] ) &&  $_POST['post_type'] == "everlead"){

             $name = stripcslashes($_POST["name"]);
             $email = stripcslashes($_POST["email"]);
             $phone = stripcslashes($_POST["phone"]);
             $website = stripcslashes($_POST["website"]);

        // Do some minor form validation to make sure there is content
        if (trim($name) == "" ) {

            echo 'Please enter your name. <br />';

        }
        if (trim($email) == "" ) {

            echo 'Please enter a valid email address.<br/>';
        }
        if (trim($phone) == "" ) {

            echo 'Please enter a contact number.<br/>';
        }
        if (trim($website) == "" ) {

            echo 'Please enter your website url.<br/>';
        }

    global $wpdb;
    //Set time
    $formtime = date('m-d-Y h:i:a');
    $ipaddress = $_SERVER['REMOTE_ADDR'];

    //Table data
    $data = array(
        'name'      => $name,
        'email'     => $email,
        'phone'     => $phone,
        'website'   => $website,
        'date'      => $formtime,
        'ipaddress' => $ipaddress
    );

    //set lead data
    $table = $wpdb->prefix . 'el_leads';

    $wpdb->insert( $table, $data, array('%s', '%s', '%s', '%s', '%s') );

    }
}
}

add_action( 'init', 'el_process_form' );

Une chose étrange avec le code ci-dessus ^^^. Tout fonctionne correctement si, sur un serveur local (xampp), vous supprimez if (isset($_POST['everlead'])) {, mais l'erreur "En-têtes déjà envoyés" apparaît lorsque vous êtes sur un site actif. "

De plus, si j'ajoute cette instruction if avant le traitement du formulaire, je ne peux pas enregistrer les données dans la base de données.

    function el_process_form(){
if(isset($_POST['post_type'])){
...process form data
}
}
add_action('init', 'el_process_form' );

Le code ci-dessus me permet de créer une nouvelle publication (comme indiqué dans le paragraphe précédent), mais les données ne sont pas enregistrées.

1
Jerry R.

Ok, pour une raison quelconque, cela fonctionne maintenant. Au lieu de me connecter à 'init', j'ai utilisé 'the_post' et le shortcode du formulaire remplit sa fonction. Je n'ai plus de problème avec la publication d'un nouveau message ou la non-sauvegarde des données. En outre, aucune erreur "Impossible de modifier les informations d'en-tête - en-têtes déjà envoyés".

La fonction

function el_process_form(){
if( $_SERVER['REQUEST_METHOD'] == 'POST' && !empty( $_POST['post_type'] ) &&  $_POST['post_type'] == "everlead"){

         $name = stripcslashes($_POST["name"]);
         $email = stripcslashes($_POST["email"]);
         $phone = stripcslashes($_POST["phone"]);
         $website = stripcslashes($_POST["website"]);

    // Do some minor form validation to make sure there is content
    if (trim($name) == "" ) {

        echo 'Please go back and enter your name. <br />';
        exit();         
    }
    if (trim($email) == "" ) {

        echo 'Please go back and enter a valid email address.<br/>';
        exit();
    }
    if (trim($phone) == "" ) {

        echo 'Please go back and enter a contact number.<br/>';
        exit();
    }
    if (trim($website) == "" ) {

        echo 'Please go back and enter your website url.<br/>';
        exit();
    }

global $wpdb;
//Set time
$formtime = date('m-d-Y h:i:a');
$ipaddress = $_SERVER['REMOTE_ADDR'];

//Table data
$data = array(
    'name'      => $name,
    'email'     => $email,
    'phone'     => $phone,
    'website'   => $website,
    'date'      => $formtime,
    'ipaddress' => $ipaddress
);

//set lead data
$table = $wpdb->prefix . 'el_leads';

$wpdb->insert( $table, $data, array('%s', '%s', '%s', '%s', '%s') );

}

}

J'utilise 'the_post' et tout va bien

add_action( 'the_post', 'el_process_form' );

Maintenant, mon shortcode [el_form buttonsize="block"] fonctionne et affiche le formulaire sur n’importe quelle page ou message. Plus important encore, il enregistre les données dans la base de données.

Je vais devoir creuser plus profondément pour savoir pourquoi "the_post" fonctionne par-dessus "init" lors de l'utilisation d'un shortcode de formulaire.

0
Jerry R.