Contact Form 7をSSL化したVirtualHost下、さらにカスタムパーマリンク下で動作させるためにちょっと苦労しました。

最初、Contact Form 7を有効にし、「送信」ボタン(お問い合わせページ)をクリックしても矢印がくるくる回っているだけで送信されませんでした。(本当は、<必須>部分が未入力であるという警告が表示されるはず。)

そこで、お問い合わせページのhtmlソースを見ると、怪しそうな箇所が1箇所ありました。それは458行目です。

<div id="post-333" class="entry-content">
	<p>ご意見ご要望がございましたら、どうぞお気軽にお問合せください。</p>
<div role="form" class="wpcf7" id="wpcf7-f1539-p333-o1" lang="ja" dir="ltr">
<div class="screen-reader-response"></div>
<form action="/?page_id=333#wpcf7-f1539-p333-o1" method="post" class="wpcf7-form" novalidate="novalidate">
<div style="display: none;">
<input type="hidden" name="_wpcf7" value="1539" />
<div id="post-333" class="entry-content">
 <p>ご意見ご要望がございましたら、どうぞお気軽にお問合せください。</p>
<div role="form" class="wpcf7" id="wpcf7-f1539-p333-o1" lang="ja" dir="ltr">
<div class="screen-reader-response"></div>
<form action="/contact/#wpcf7-f1539-p333-o1" method="post" class="wpcf7-form" novalidate="novalidate">
<div style="display: none;">
<input type="hidden" name="_wpcf7" value="1539" />

formタグ内のaction属性の属性値が異なっています。きちんとCF7が動作しているhtmlでは、属性値が/?page_id=333というようにページIDで表示されています。これは、Wordpressのデフォルトのパーマリンクです。しかし、CF7が動作しないhtmlのaction属性値は/contact/というカスタムパーマリンクになっています。

サイトのURLの運用はカスタムパーマリンクで行いたいのでなんとか回避策を考えなければなりません。(そもそもの話ですが、もしSSL化していなければ問題なく普通に動作してくれます。(動作検証済み)また、SSL化していてもVirtualHostでなければ動作するはずです。(こちらは検証していません。))

それなら、「お問い合わせ」ページだけデフォルトのパーマリンク(/?p=123形式)にすればいいのですが、現在のところその方法がわかりません。プラグインにCustom Permalinksというのがあり、それを使って/contact/をpage_id=333にしてみましたが実際にURLを見ると/contact/に戻っていました。

しょうがないので、プラグインをちょこっと改変することにしました。でも、プラグインのアップデートがあると改変した部分は消えて元にもどるので、アップデートの度に修正が必要になります。(だから、本当はしないほうがよい。しかし、回避策が今のところ思いつかないので泣く泣くやる。また、セキュリティ面でも改変を誤ると脆弱性の温床になるので要注意です。)

では、さっそく手順を記しておきます。

【前提条件】

  1. サイトをVirtualHostで運用し、SSL化している
  2. Contact Form 7が以前は正常に動作していた(/?p=123)

<手順>

  1. 「お問い合わせ」のページIDを調べる
  2. CF7プラグイン内のfunctions.phpを編集
  3. 動作確認
  4. 番外1と番外2があります(備忘録的なもの)

1.「お問い合わせ」のページIDを調べる

「お問い合わせ」ページは、固定ページにCF7のショートコードを貼り付けているので、その固定ページのURL部分のpost=XXX部分を読み取ると、post=333となっていたので、ページIDは333である。

URLのpost=333から読み取る

URLのpost=333から読み取る

2.CF7プラグイン内のfunctions.phpを編集

(1) Contact Form 7 > includes > functions.php を開く

WordPressのプラグイン>プラグイン編集を使ってもいいです。私は、WinSCPで自サーバに接続し、Contact-Form-7をローカルにダウンロードして作業をしています。まぁ、何でもいいので編集してください。(もちろん、安全に注意してください。必要であればバックアップもとっておきましょう。私は念のためにfunctions-bk20150923.phpみたいにしてローカルにコピってます。)

(2) functions.phpを編集

167行目のfunction wpcf7_get_request_uri()内の172行目を改変する。

function wpcf7_get_request_uri() {
	static $request_uri = '';

	if ( empty( $request_uri ) ) {

		$request_uri = add_query_arg( array() );

	}

	return esc_url_raw( $request_uri );
}

ハイライト部分(171行目から187行目まで)を改変した。

function wpcf7_get_request_uri() {
	static $request_uri = '';
	
	//add start 20150923 ページIDでform actionを実行させるため
	$id = '';//初期化
	$id = get_the_ID();//現在表示(お問い合わせ)ページのIDを取得
	//add end 20150923 shigidtpc
	
	if ( empty( $request_uri ) ) {
	
//add start 20150923
		if ( empty( $id ) ) { //ブラウザから最初に呼び出されるとまだIDは取得されない。
//add end 20150923

			return esc_url_raw( $request_uri ); //空の$request_uriを返す。
		}
		
		//mod start 20150923 
        //「/?page_id=333」をURLとして吐き出させる。
		$request_uri = add_query_arg( array('page_id'=> $id ),'/' ); 
		/* $request_uri = add_query_arg( array() ); //del 20150921 削除*/
		//mod end 20150923
		
	}

	return esc_url_raw( $request_uri );
	
}

functions.php(注意:Wordpressのfunctions.phpではありません。もちろん、CF7のfunctions.phpです。)を上書き保存し、サーバにアップして、動作確認する。

3.動作確認

必須項目を空にして送信ボタンを押したときの挙動と全てを入力して送信ボタンを押したときの挙動を確認する。

無事に、「お問い合わせ」が処理されました。CF7もちゃんと動作しておりました。

さて、ここで、ふと疑問が2つほど出てきたのではありませんか?