質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

Q&A

0回答

1668閲覧

Wordpress外のディレクトリでheader.phpをインクルードし、session_startしてフォームを実装するとWordpressの機能を阻害するでしょうか、ご意見ください

jiyo-ta

総合スコア13

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

0グッド

0クリップ

投稿2021/09/26 00:41

編集2021/09/26 00:44

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問