Wordpress外のcontactディレクトリで問い合わせフォームを実装しています。
共通化のためフォームではheader.phpをインクルードしており、session_startはheaderインクルード前に実行しています。
色々と検索しているとWordpressでエラーが出てしまう、という事例を目にします。
WordPress でセッションを使うときに色々怒られた件
今のところサイトヘルスに問題が出ていたり、カスタムフィールドが保存できなかったり、予約投稿ができないということはなく正常に機能しているように思えるのですが、
セッションを使うことは良くない、session_startはこのように書くべき、こういった問題が起きる、などございましたらご教授お願いいたします。
問題がありそうであればheader.phpの読み込みをやめ、Wordpressと切り離そうと考えています。
なお、参考サイトにはfunctions.phpにsession_startを設定していますが、
今回はfunctions.phpではなく/contact/index.php、/contact/post.php、/contact/complete/index.phpの最初に設定しています。
【ディレクトリ構成】
(root)-----
|
├contact
│ ├index.php //入力ページ
│ ├post.php //Salesforceへデータ送信
│ └ complete
│ └ index.php //完了ページ
│
├wp-content
├wp-admin
├wp-includes
├wp-config.php
├wp-login.php
....
【ソース】
※一部簡素化しています。入力チェックは別途実装しておりますがここでは割愛します。
●/contact/index.php
<?php // セッションにデータを格納する session_start(); // Tokenを生成。Tokenを利用することで、CSRF対策となる // 疑似乱数を生成 $bytes = openssl_random_pseudo_bytes(16); // 16進数に変換 $token = bin2hex($bytes); // セッションにセット $_SESSION['token'] = $token; ?> <?php require_once('../wp-load.php'); include("../wp-content/themes/my-wp/header.php"); ?> <main id="contents"> <form action="post.php" method="post"> <input type="hidden" name="token" value="<?php print $token ?>"> <input type="submit" value="データ送信"> </form> </main> <?php require_once('../wp-load.php'); include("../wp-content/themes/my-wp/footer.php"); ?>
●/contact/post.php
<?php require_once('./salesforce.php'); //CSRF トークンを比較し、一致しなければエラー出力 // セッションスタート session_start(); // POSTデータのトークンを確認 if(isset($_POST['token'])){$post_token = $_POST['token'];} else{$post_token = 'err123';} // SESSIONデータのトークンを確認 if(isset($_SESSION['token'])){$session_token = $_SESSION['token'];} else{$session_token='err456';} // トークンを比較し、一致しなければエラー出力 if($post_token != $session_token || $_SERVER['REQUEST_METHOD']!='POST'){ echo 'エラー:ページ遷移が正しくありません';exit(); } # 設定ファイルの読み込み $config = parse_ini_file("./libs/.config.ini", true); $salesforce = new Salesforce( $config['salesforce']['client_id'], $config['salesforce']['client_secret'], $config['salesforce']['username'], $config['salesforce']['password'], $config['salesforce']['token'], $config['env']['is_production'] ); # pass $pass ='/complete/'; /* * HTMLの特殊文字をエスケープ */ function h($str){ return htmlspecialchars($str,ENT_QUOTES,'UTF-8'); } $insertdata = []; //POSTされたデータを各変数に入れる $insertdata['LastName__c'] = isset($_POST['LastName']) ? h($_POST['LastName']) : NULL; $insertdata['FirstName__c'] = isset($_POST['FirstName']) ? h($_POST['FirstName']) : NULL; $insertdata['CompanyName__c'] = isset($_POST['CompanyName']) ? h($_POST['CompanyName']) : NULL; $insertdata['Mail__c'] = isset($_POST['email']) ? h($_POST['email']) : NULL; $insertdata['Phone__c'] = isset($_POST['tel']) ? h($_POST['tel']) : NULL; /* *ここから登録処理 割愛します * * *ここから登録処理終わり */ #セッション破棄 完了画面へ遷移 $url = $pass; unset($_SESSION['token']); session_destroy(); header('Location:' . $url ); ?>
●/contact/complete/index.php
<?php //CSRF トークンを比較し、一致しなければエラー出力 // セッションスタート session_start(); // POSTデータのトークンを確認 if(isset($_POST['token'])){$post_token = $_POST['token'];} else{$post_token = 'err123';} // SESSIONデータのトークンを確認 if(isset($_SESSION['token'])){$session_token = $_SESSION['token'];} else{$session_token='err456';} // トークンを比較し、一致しなければエラー出力 if($post_token != $session_token || $_SERVER['REQUEST_METHOD']!='POST'){ echo 'エラー:ページ遷移が正しくありません';exit(); } ?> <?php require_once('../../wp-load.php'); include("../../wp-content/themes/my-wp/header.php"); ?> <main id="contents"> <h1 class="hdg-type-01">お問い合わせありがとうございました</h1> </main> <?php require_once('../../wp-load.php'); include("../../wp-content/themes/my-wp/footer.php"); ?>
●header.php(テーマファイル)
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=yes,viewport-fit=cover"> <meta name="format-detection" content="telephone=no"> <meta name="description" content=""> <title>タイトル</title> <link rel="stylesheet" href="<?php echo get_template_directory_uri(); ?>/common/css/style.css"> <script src="<?php echo get_template_directory_uri(); ?>/common/js/common.js"></script> <?php wp_head(); ?> </head> <body> <div id="page"> <header> <h1 id="site-id"><a href="/"><img src="<?php echo get_template_directory_uri(); ?>/common/images/header/main.svg" alt=""></h1> <div id="global-nav"> </div><!-- /#global-nav --> </header>
【使用プラグイン】
Advanced Custom Fields
Custom Post Type Permalinks
あなたの回答
tips
プレビュー