$ _POST vuoto su invio (stesso codice, stesso modulo inviato normalmente sul server locale)

Il mio codice è stato controllato e sembra OK quindi forse il problema sta nel file htaccess il cui contenuto sul mio server online è:

 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] 

Qualche motivo per cui questo htaccess impedisce ai moduli di inviare correttamente sul mio sito?

Nel caso in cui qui è il mio codice:

 <form id='contact_form_mmt' action='/contact' method='post'> <input type='text' name='contact_nom' placeholder='Votre nom *' data-validation='length' data-validation-length='min3' data-validation-error-msg=''> <input type='text' name='contact_prenom' placeholder='Votre prénom *' data-validation='length' data-validation-length='min3' data-validation-error-msg=''> <input type='text' name='contact_mail' placeholder='Votre mail *' data-validation='email' data-validation-length='min3' data-validation-error-msg=''>  Information générales Problèmes liés au site  <textarea name='contact_message' placeholder='Message *'data-validation='length' data-validation-length='min3' data-validation-error-msg=''>    

PHP (so che la syntax è brutta, la migliorerò):

 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 = ''; 

Solutions Collecting From Web of "$ _POST vuoto su invio (stesso codice, stesso modulo inviato normalmente sul server locale)"

Il modo migliore per gestire i messaggi di forma in WordPress è utilizzare un endpoint speciale, /wp-admin/admin-post.php .

I dati POST possono essere incasinati, sia dalla chiamata Query WP, sia da eventuali reindirizzamenti che si verificano.

Quindi imposti il ​​modulo con questa azione:

 
< ?php wp_nonce_field('special_action_nonce', 'special_action_nonce'); ?>

Quindi puoi gestire il modulo aggiungendo un’azione al tuo tema o plugin:

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

Nota che WordPress costruisce un’azione speciale, basata sul valore dell’azione nel modulo, admin_post_no_priv_ special_action (se sei disconnesso) e admin_post_ special_action (se hai effettuato l’accesso). Puoi indicarli in posizioni diverse.

Questi endpoint di azione avranno sempre accesso a POST e non attiveranno mai un reindirizzamento (che è spesso ciò che WordPress fa per le belle route … spesso indirizza: site.com/about a site.com/?pageName=about ).

Una volta che hai gestito il modulo come vuoi, puoi fare un wp_redirect () per arrivare dove vuoi che sia. Ciò è utile anche perché un aggiornamento accidentale della pagina non invierà nuovamente il modulo.

Doco molto più lungo può essere trovato qui: https://www.sitepoint.com/handling-post-requests-the-wordpress-way/

Il problema è con il tuo htaccess in quanto stai reindirizzando verso un altro URL, facendo in modo che i dati POST non siano più disponibili.

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

Dovrebbe essere

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

Puoi anche impostare di non redirect su un POST:

 RewriteCond %{REQUEST_METHOD} !POST [NC] 

O, usa un reindirizzamento 307, che conserverà i dati POST https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_Redirection


È inoltre ansible utilizzare le istruzioni IF shorthand PHP e raccomandare l’uso di array_key_exists su isset quando si controlla un array

 $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

Dovresti anche disinfettare i dati che arrivano dai moduli frontend, per prevenire eventuali vulnerabilità di sicurezza.
WordPress ha un sacco di questi strumenti che puoi usare: https://codex.wordpress.org/Validating_Sanitizing_and_Escaping_User_Data


E perché non usare solo qualcosa come Caldera Forms che gestirà tutto questo per te? https://wordpress.org/plugins/caldera-forms/

Potrebbe essere necessario utilizzare bloginfo('url') aka home_url() (sito visualizzato) invece di bloginfo('wpurl') aka site_url() (posizione dei file wordpress) nell’azione, ad esempio:

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