web-dev-qa-db-fra.com

$ _POST vide lors de l'envoi (même code, le même formulaire est envoyé normalement sur le serveur local)

Mon code a été vérifié et semble correct. Le problème réside peut-être dans le fichier htaccess dont le contenu sur mon serveur en ligne est le suivant:

SetEnv PHP_VER 5_4
Options -Indexes
ErrorDocument 404 /index.php
RewriteEngine on 
RewriteCond %{HTTP_Host} !^www.example.fr$
RewriteRule ^(.*)   http://www.example.fr/$1  [QSA,L,R=301] 

Une raison pour laquelle cette htaccess empêche les formulaires de se soumettre correctement sur mon site?

Juste au cas où voici mon code:

<form id='contact_form_mmt' action='<?php echo bloginfo("wpurl"); ?>/contact' method='post'>
  <input type='text' name='contact_nom' placeholder='Votre nom *' data-validation='length' data-validation-length='min3' data-validation-error-msg='<?php echo $text_too_short_or_empty; ?>'>  
  <input type='text' name='contact_prenom' placeholder='Votre prénom *' data-validation='length' data-validation-length='min3' data-validation-error-msg='<?php echo $text_too_short_or_empty; ?>'>
  <input type='text' name='contact_mail' placeholder='Votre mail *' data-validation='email' data-validation-length='min3' data-validation-error-msg='<?php echo $email_valid; ?>'>
  <select name='contact_destinataire'>
    <option value="[email protected]|Information générales">Information générales</option>
    <option value="[email protected]|Problèmes liés au site">Problèmes liés au site</option>
  </select>
  <textarea name='contact_message' placeholder='Message *'data-validation='length' data-validation-length='min3' data-validation-error-msg='<?php echo $text_too_short_or_empty; ?>'></textarea>  
  <input type='hidden' name='sub' value='1'>  
  <input type='submit' value='envoyer'>
</form>

PHP (je sais que la syntaxe est moche, je vais améliorer ça):

if ( isset($_POST['sub']) ) $sub = $_POST['sub']; else $sub = ''; 
if ( isset($_POST['contact_nom']) ) $contact_nom = $_POST['contact_nom']; else $contact_nom = ''; 
if ( isset($_POST['contact_prenom']) ) $contact_prenom = $_POST['contact_prenom' ]; else $contact_prenom = ''; 
if ( isset($_POST['contact_mail']) ) $contact_mail = $_POST['contact_mail']; else $contact_mail = ''; 
if ( isset($_POST['contact_sujet']) ) $contact_sujet = $_POST['contact_sujet']; else $contact_sujet = ''; 
if ( isset($_POST['contact_destinataire']) ) $contact_destinataire = $_POST['contact_destinataire']; else $contact_destinataire = ''; 
if ( isset($_POST['contact_message']) ) $contact_message = $_POST['contact_message']; else $contact_message = ''; 
1
drake035

La meilleure façon de traiter les messages de formulaire dans Wordpress consiste à utiliser un point de terminaison spécial, /wp-admin/admin-post.php .

Les données POST peuvent être perturbées, à la fois par l'appel de requête WP et par les redirections éventuelles.

Donc, vous configurez votre formulaire avec cette action:

<form action="<?= admin_url('admin-post.php') ?>" method="post">
<input type="hidden" name="action" value="special_action">
<?php wp_nonce_field('special_action_nonce', 'special_action_nonce'); ?>

Ensuite, vous pouvez gérer le formulaire en ajoutant une action à votre thème ou à votre plugin:

add_action('admin_post_nopriv_special_action', ['My\Plugins\FormController', 'specialAction']);
add_action('admin_post_special_action', ['My\Plugins\FormController', 'specialAction']);

Notez que Wordpress construit une action spéciale, basée sur la action valeur sous la forme, admin_post_no_priv _special_action(si vous êtes déconnecté) et admin_post _special_action(si vous êtes connecté). Vous pouvez les indiquer à différents endroits.

Ces points de terminaison d’action auront toujours accès à POST et ne déclencheront jamais de redirection (ce qui est souvent le cas de Wordpress pour les jolies routes ... il route souvent: site.com/about} _ à site. com /? pageName = about).

Une fois que vous avez géré le formulaire à votre guise, vous pouvez faire un wp_redirect () pour vous rendre là où vous en avez besoin. Cela est également utile car une actualisation accidentelle de la page ne renverra pas le formulaire.

Une documentation beaucoup plus longue peut être trouvée ici: https://www.sitepoint.com/handling-post-requests-the-wordpress-way/

3
haz

Le problème vient de votre htaccess dans la mesure où vous redirigez vers une autre URL, ce qui empêche les données POST de ne plus être disponibles.

RewriteRule ^(.*)   http://www.example.fr/$1 [QSA,L,R=301] 

Devrait être

RewriteRule ^(.*)   /$1 [QSA,L,R]

Vous pouvez également le configurer pour qu'il ne redirige pas sur un POST:

RewriteCond %{REQUEST_METHOD} !POST [NC]

OU, utilisez une redirection 307, qui conservera le POST data https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_Redirection


Vous pouvez également utiliser les instructions IF abrégées PHP et vous recommander d'utiliser array_key_exists à isset lorsque vous vérifiez un tableau.

$sub = array_key_exists( 'sub', $_POST ) ? $_POST[ 'sub' ] : '';
$contact_nom = array_key_exists( 'contact_nom', $_POST ) ? $_POST[ 'contact_nom' ] : '';
$contact_prenom = array_key_exists( 'contact_prenom', $_POST ) ? $_POST[ 'contact_prenom' ] : '';
$contact_mail = array_key_exists( 'contact_mail', $_POST ) ? $_POST[ 'contact_mail' ] : '';
$contact_sujet = array_key_exists( 'contact_sujet', $_POST ) ? $_POST[ 'contact_sujet' ] : '';
$contact_destinataire = array_key_exists( 'contact_destinataire', $_POST ) ? $_POST[ 'contact_destinataire' ] : '';
$contact_message = array_key_exists( 'contact_message', $_POST ) ? $_POST[ 'contact_message' ] : '';

https://davidwalsh.name/php-ternary-examples

Vous devez également procéder à la désinfection des données provenant de formulaires frontaux afin d’éviter toute faille de sécurité.
WordPress a beaucoup de ces éléments intégrés que vous pouvez utiliser: https://codex.wordpress.org/Validating_Sanitizing_and_Escaping_User_Data


Et pourquoi ne pas simplement utiliser quelque chose comme Caldera Forms qui gérera tout cela pour vous? https://wordpress.org/plugins/caldera-forms/

3
sMyles

Vous devrez peut-être utiliser bloginfo('url') aka home_url() (site affiché) au lieu de bloginfo('wpurl') aka site_url() (emplacement des fichiers wordpress) dans votre action, par exemple:

action="<?php echo home_url('/contact/'); ?>"
1
Michelle