$_POST gol la trimitere (același cod, același formular se trimite în mod normal pe serverul local) (WordPress, Formulare, Htaccess)

drake035 a intrebat.
a intrebat.

Codul meu a fost verificat și pare OK, deci poate că problema se află în htaccess al cărui conținut pe serverul meu online este:

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] 

Există vreun motiv pentru care acest lucru htaccess ar împiedica formularele să se trimită corect pe site-ul meu?

Pentru orice eventualitate iată codul meu:

<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 (știu că sintaxa este urâtă, voi îmbunătăți asta):

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

Comentarii

  • Și unde este codul care gestionează cererea în PHP? –  > Por jgraup.
  • Adăugat în întrebare. –  > Por drake035.
  • codex.wordpress.org/Function_Reference/wp_parse_args vă va ajuta să curățați valorile implicite. –  > Por jgraup.
  • Puteți var_dump($_POST); și să postezi rezultatele? –  > Por jgraup.
  • și var_dump($_REQUEST); ? –  > Por jgraup.
3 răspunsuri
haz

Cel mai bun mod de a trata cu Form Posts în WordPress este de a folosi un endpoint special, /wp-admin/admin-post.php.

Datele POST pot fi încurcate, atât de apelul WP Query, cât și de orice redirecționări care se întâmplă.

Așadar, configurați formularul cu această acțiune:

<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'); ?>

Apoi puteți gestiona formularul prin adăugarea unei acțiuni la tema sau la pluginul dumneavoastră:

add_action('admin_post_nopriv_special_action', ['MyPluginsFormController', 'specialAction']);
add_action('admin_post_special_action', ['MyPluginsFormController', 'specialAction']);

Rețineți că WordPress construiește o acțiune specială, bazată pe acțiune din formular, admin_post_no_priv_special_action (dacă sunteți deconectat) și admin_post_special_action (dacă sunteți conectat). Puteți să le îndreptați în locații diferite.

Aceste puncte finale de acțiune vor avea întotdeauna acces la POST și nu vor declanșa niciodată o redirecționare (ceea ce face adesea WordPress pentru rutele destul de… deseori rutează: site.com/about către site.com/?pageName=about).

După ce ați gestionat formularul așa cum doriți, puteți face un wp_redirect() pentru a ajunge acolo unde doriți să fie. Acest lucru este util și pentru că o reîmprospătare accidentală a paginii nu va retrimite formularul.

Un doco mult mai lung poate fi găsit aici:https://www.sitepoint.com/handling-post-requests-the-wordpress-way/

Comentarii

  • Nonce-ul nu este strict necesar, dar aproape întotdeauna o idee bună. –  > Por haz.
  • Am încercat acest lucru și pare să rezolve problema pierderii datelor POST. Totuși, cum pot afișa un mesaj de confirmare odată ce utilizatorul este redirecționat înapoi la pagina de contact? –  > Por drake035.
  • Pentru noi este ușor, deoarece cineva a scris o clasă personalizată Status Message (Mesaj de stare) care stochează un mesaj de confirmare în sesiune, iar apoi îl citește în sesiune. Desigur, nimic nu vă împiedică să scrieți în $_SESSION; dar trebuie să vă asigurați că îl ștergeți după ce l-ați vizualizat. –  > Por haz.
  • Argh, am vrut sincer să vă acord recompensa astăzi, deoarece am plănuit să revin la problemă și să o termin, dar recompensa a dispărut. De ce este atât de scurt termenul de atribuire? Pot să fac ceva în legătură cu asta? –  > Por drake035.
sMyles

Problema este cu dvs. htaccess în sensul că redirecționați către o altă adresă URL, ceea ce face ca datele POST să nu mai fie disponibile.

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

Ar trebui să fie

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

Ai putea, de asemenea, să îl setezi să nu redirecționeze și la un POST:

RewriteCond %{REQUEST_METHOD} !POST [NC]

SAU, utilizați o redirecționare 307, care va păstra datele POSThttps://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_Redirection


Puteți utiliza, de asemenea, instrucțiuni IF prescurtate din PHP și vă recomandăm să utilizați array_key_exists în loc de isset atunci când verificați o matrice

$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

Ar trebui, de asemenea, să curățați datele care vin din formularele din față, pentru a preveni orice posibile vulnerabilități de securitate.
WordPress are o mulțime de astfel de elemente încorporate pe care le puteți utiliza:https://codex.wordpress.org/Validating_Sanitizing_and_Escaping_User_Data


Și de ce să nu folosiți ceva precum Caldera Forms, care se va ocupa de toate acestea pentru dumneavoastră?https://wordpress.org/plugins/caldera-forms/

Comentarii

  • Tocmai am înlocuit RewriteRule ^(.*) exemplu.fr/$1 [QSA,L,R=301] cu RewriteRule ^(.*) /$1 [QSA,L,R], conform instrucțiunilor. Problema persistă. –  > Por drake035.
  • Se pare că problema nu se datorează htaccess-ului tău, ci altceva. Verificați cu compania de găzduire și vedeți dacă au mod_security activat în contul tău. Ați verificat să vă asigurați că chiar trimiteți POST la URL-ul corect? –  > Por sMyles.
  • Când/cum verificați valorile POST? Nu ați oferit prea multe detalii despre momentul în care se execută codul de verificare a valorilor? Asigurați-vă că atunci când vizualizați sursa site-ului, URL-ul este corect (în acțiune)… și sunteți sigur că codul dvs. pentru a obține valorile POST se execută efectiv atunci când este trimis POST-ul? –  > Por sMyles.
Michelle

Este posibil să fie nevoie să utilizați bloginfo('url') aka home_url() (site-ul afișat) în loc de bloginfo('wpurl') aka site_url() (locația fișierelor wordpress) în acțiunea ta, de exemplu:

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

Comentarii

  • Nu ar eșua să funcționeze atât la nivel local, cât și online, dacă aceasta ar fi problema, iar pagina care se încarcă la trimitere nu ar fi o pagină diferită de pagina formularului? –  > Por drake035.
  • În mod normal, aș spune că da, dar depinde de modul în care este configurată instalarea locală. Poți să încerci să o schimbi și să vezi dacă funcționează cu acest cod la nivel local? –  > Por Michelle.
  • Tocmai am încercat, nu se schimbă nimic. –  > Por drake035.