web-dev-qa-db-ja.com

送信時に$ _POSTが空です(同じコード、同じフォームが通常ローカルサーバーに送信されます)。

私のコードはチェックされて問題ないと思われるので、おそらく問題は私のオンラインサーバー上の内容がhtaccessファイルにある:

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] 

このhtaccessがフォームが私のサイトに正しく送信されるのを妨げる理由は何ですか?

念のため、これが私のコードです。

<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(私は構文が醜いことを知っています、私はそれを改良するつもりです):

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

Wordpressでフォーム投稿を処理する最良の方法は、特別なエンドポイント/wp-admin/admin-post.phpを使うことです。

POSTデータは、WP Query呼び出し、および発生したリダイレクトによって、混乱する可能性があります。

だからあなたはこのアクションであなたのフォームをセットアップしました:

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

その後、テーマやプラグインにアクションを追加することでフォームを処理できます。

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

Wordpressは、フォーム内のaction値に基づいて、admin_post_no_priv _ special_action (ログアウトしている場合)という特別なアクションを作成しますadmin_post _ special_action (ログインしている場合)これらを異なる場所に向けることができます。

これらのアクションエンドポイントは常にPOSTにアクセスでき、リダイレクトを引き起こすことは決してありません(これはWordpressがきれいなルートに対して行うことです... site.com/about to siteにルーティングすることがよくあります)。 com /?pageName = about )。

必要な場所にフォームを処理したら、必要な場所に移動するためにwp_redirect()を実行できます。誤ってページを更新してもフォームは再送信されないため、これも役立ちます。

もっと長いdocoはここにあります: https://www.sitepoint.com/handling-post-requests-the-wordpress-way/

3
haz

htaccessの問題は、あなたが別のURLにリダイレクトしているため、POSTデータが利用できなくなっていることです。

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

する必要があります

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

POSTにリダイレクトしないように設定することもできます。

RewriteCond %{REQUEST_METHOD} !POST [NC]

または、307リダイレクトを使用してください。これはPOST data https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_Redirection を保持します。


PHPの簡単なIF文を使うこともできます。配列をチェックするときは、issetよりarray_key_existsを使うことをお勧めします。

$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

セキュリティの脆弱性を防ぐために、フロントエンドのフォームから送られてくるデータをサニタイズする必要があります。
WordPressには、使用できるという点で多くの機能が組み込まれています。 https://codex.wordpress.org/Validating_Sanitizing_and_Escaping_User_Data


そして、Caldera Formsのようなものすべてをあなたに代わって使用するのではないでしょうか。 https://wordpress.org/plugins/caldera-forms/ /

3
sMyles

あなたのアクションではbloginfo('url') aka home_url() (wordpress files location)の代わりにbloginfo('wpurl') aka site_url() (表示されたサイト)を使う必要があるかもしれません、例えば:

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