ContactForm7から送信したメールが迷惑メール判定されるのを防ぐ

WordPressでサイトを作って、公開前に念のため問い合わせフォームの送信テストをしよ〜っと思って送ってみたら
あれ?届かない、、、あ!迷惑メールフォルダに振り分けられてる!…という経験はないでしょうか?

わたしは多々あります。

迷惑メールに振り分けられる原因

ContactForm7に限らず、Wordpressでは、php mailという仕組みを使ってメールを送信しています。
Wordpressが稼働しているサーバーを通じてメールを送信するので、本来使うべきメール送信サーバーと違っていたり
稼働サーバーとメール送信サーバーを同一のものと認識してもらえなかったり…。

Gmailを例に挙げると、Fromに書いてあるメールアドレスと送信元のアドレスが違っている、
また「セキュリティ:このメールは shared-server.net で暗号化されませんでした 」と警告が出ていませんか?

送信元とメールアドレスが違う場合、偽装してメールを送信していると思われて迷惑メールに振り分けられてしまうことがあります。
最悪の場合、サーバー側でスパムメールと判定され、受信すらされなくなってしまいます。

迷惑メールに振り分けられないための対策

ある程度仕方がないものと思ってあまり真剣に取り組んでいなかったのですが
ちょっと真面目に対策を考えてみることにしました。

見つけた対策方法は3つ

1については、根本的な解決策ではありませんが
今回のような問題以外にもかなりお役立ちなプラグインなので
この機会に導入しておくのもいいかな…と思い、メモ的に残しておきます。

対策1.「Flamingo」を使ってWP管理画面で問い合わせを確認

通常、ContactForm7で送信されたメッセージはどこにも保存されません。
なので、もしサーバー側でスパム判定をされてしまうと、せっかくのお問い合わせがパーに…!

そんな問題を回避できるのが、プラグイン「Flamingo」です。
「ContactForm7」の作者さんが作られたプラグインなので、導入がとてもスムーズ!

「Flamingo」の設定方法

使い方はいたって簡単です。

プラグイン→「Flamingo」で検索→インストール&有効化

これだけですぐに使えるのですが、
デフォルトでは送信されたお問い合わせ一覧をみると、

・[your-subject](件名)
・[your-name](送信者の名前)
・[your-email](メールアドレス)

が表示されています。

フォームの内容を変更している場合、正しく表示されなくなってしまうので
コンタクトフォーム編集ページの「その他の設定」タブに以下のように記述します。

flamingo_email: "[メールアドレスに指定したフィールド名]"
flamingo_name: "[送信者に指定したフィールド名]"
flamingo_subject: "[タイトルに指定したフィールド名]"

また、送信者名が二つに分かれている場合や
会社名と担当者名を表示させたい場合には、下記のように記述することもできます。

flamingo_name: "[会社名に指定したフィールド名] [担当者に指定したフィールド名]"

これで、お問い合わせメールが届かない!となっても慌てずに済みますね。

対策2.「WP Mail SMTP」でスパム判定を回避

WP Mail SMTP」は、SMTPサーバーを使ってメール送信することができるプラグインです。
Wordpressが稼働しているサーバーを通さず、メールサーバーから送信します!という設定ができるのです、ありがたい。
(※プラグインの設定次第でphp mailも使えますが、今回は割愛します。)

「WP Mail SMTP」の設定方法

プラグイン→「WP Mail SMTP」で検索→インストール&有効化

あとは、
「設定」→「WP Mail SMTP」で各設定を行っていきいます。
利用しているメールサーバーの情報を用意してください。

送信元アドレス:設定したいアドレス
送信者名:設定したい送信者名
メーラー:「WordPressの全てのメールをSMTP経由で送信する。」
返信先:任意でチェックしてください

SMTP ホスト:利用しているメールサーバーのSMTPホスト(例:121.122.xxx.xx)
SMTP ポート:暗号化にSSLを選ぶ場合は465、TLSの場合は587がほとんどですが、サーバー毎にご確認ください。
暗号化:SSLもしくはTLS
認証:はい
ユーザー名:メールアカウントのユーザー名
パスワード:メールアカウントのパスワード

変更を保存したら、「テストメールの送信」へ!

送信完了すると、エラーメッセージかと思うようなメッセージがずらーっと出てきますが
冒頭に「bool(true)」と出ていれば設定OK!
実際に届いたメールを確認してみてください。
「セキュリティ:標準的な暗号化(SSLもしくはTLS)」となっているはずです◎

設定は合っているのに「bool(false)」となる場合

functions.phpに下記を入れてみてください。
※プラグインファイルに直接書き込む方法もありますが、プラグインの更新が出来なくなるのは怖いので、functions.phpへ!

<?php
function my_wp_mail_smtp_custom_options ( $phpmailer ) {
	if ( isset( $phpmailer->SMTPAuth ) ) {
		if ( $phpmailer->SMTPAuth == true ) {
			$phpmailer->SMTPOptions = array('ssl' => array('verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true));
		}
	}
	return $phpmailer;
}
add_filter("wp_mail_smtp_custom_options","my_wp_mail_smtp_custom_options");
?>

もしくは、「SMTP Mailer」というプラグインも
「WP Mail SMTP」と同様の働きをしてくれるので、function.phpを触るの苦手…という方にはこちらもおすすめです。

参考:「SMTP Mailerでスパム判定回避。WP Mail SMTPで発生する送信エラーも対応

対策3.DNSレコードを設定して、スパム判定を回避

これは、wordpressの稼働サーバーとメール送信サーバーが同じなのに
同一のものと認識してもらえないときの設定方法です。

Gmailで例を挙げると、右端▼の「メッセージのソースを表示」からメールヘッダーを確認して
Received-SPF: neutral」となってしまっている状態です。

この問題は、SPFレコードというものをDNSレコード設定に追加で書き込むことで解決できます。
※利用しているサーバーによって設定方法・記述内容は少しずつ違いますので
「利用サーバー SPF」で検索して確認しながら設定してみてください。

各サーバーの設定例

個人的によく使うサーバーの設定例です。

お名前.comのSPF設定例

ホスト名:空欄
TYPE:TXT
VALUE:v=spf1 ip4:111.111.xxx.xx ~all

さくらサーバーのSPF設定例

エントリ名:@
種別:TXT
値:v=spf1 ip4:111.111.xxx.xx include:sample.com ~all
DNSチェック:する
TTLの指定:チェックしない

GMOクラウドのSPF設定例

ホスト名:@
TYPE:TXT
MX優先:空欄
VALUE:v=spf1 ip4:111.111.xxx.xx ~all

111.111.xxx.xxにはIPアドレスを、sample.comにはドメインを入れてください。

まとめ

ずっと避けていた問題なだけに、解決方法がわかってすっきりしました!

今回、全て実際に試してみた中では
一番手っ取り早い方法は、「WP Mail SMTP」かなと感じました。

丁寧にいくなら、Wordpress稼働サーバーとメールサーバーが同じ場合には
DNSレコード設定もしておいたほうがいいのかな…どうなのかな……?

別ページのカスタムフィールドから値を取得する

別ページのカスタムフィールドを、IDの指定で取得する

<?php
$fields = get_post_custom(取得したいページのID); //ページIDの取得
$val = $fields['カスタムフィールド名'][0]; //フィールドkeyの取得
echo $val; //表示
?>

画像を取得する場合

色々探したけど、見つけられなかったので備忘録。
(実はどういう仕組みになっているのかよくわかっていないので、詳しい方教えていただきたいです・・・;)

<?php
$fields = get_post_custom(取得したいページのID); //ページIDの取得
$image_id = $fields['カスタムフィールド名'][0]; //画像IDの取得
echo wp_get_attachment_image($image_id, $size); //画像IDから画像を表示 $sizeに表示サイズを設定(デフォルトは'thumbnail')
?>

WP 管理画面 投稿のラベル名を変更する

あまり需要はなさそうですが、
Wordpressデフォルトの「投稿」の管理画面でのラベルを変更する方法を紹介します。

functions.phpに以下を追加

function change_post_menu_label() {
	global $menu;
	global $submenu;
	$menu[5][0] = 'お知らせ';
	$submenu['edit.php'][5][0] = 'お知らせ一覧';
	$submenu['edit.php'][10][0] = '新しいお知らせ';
	$submenu['edit.php'][16][0] = 'タグ';
	//echo ”;
}
function change_post_object_label() {
	global $wp_post_types;
	$labels = &$wp_post_types['post']->labels;
	$labels->name = 'お知らせ';
	$labels->singular_name = 'お知らせ';
	$labels->add_new = _x('追加', 'お知らせ');
	$labels->add_new_item = '新しいお知らせ';
	$labels->edit_item = 'お知らせの編集';
	$labels->new_item = '新しいお知らせ';
	$labels->view_item = 'お知らせを表示';
	$labels->search_items = 'お知らせ検索';
	$labels->not_found = 'お知らせが見つかりませんでした';
	$labels->not_found_in_trash = 'ゴミ箱のお知らせにも見つかりませんでした';
}
add_action( 'init', 'change_post_object_label' );
add_action( 'admin_menu', 'change_post_menu_label' );

bb press でトピック表示順を変更

bb press のデフォルトのトピック並び順は、最近返信がついた(アクティビティがあった)順です。
これを、通常の投稿記事のように「トピックが作成された日付順」に並べ替える方法。

function.phpに以下を追加

function my_custom_display_topic_index_query () {
  $args['orderby'] = 'date';
  $args['order']   = 'DESC';

  return $args;
}
add_filter('bbp_before_has_topics_parse_args', 'my_custom_display_topic_index_query' );

特定のフォーラムのみ並び順を変更したい場合

//* Change sort order of Topics within a specified bbpress forum
function my_custom_display_topic_index_query ($args) {
  $thisforumid = bbp_get_forum_id();

  if($thisforumid == 230) {
    $args['orderby'] = 'date';
    $args['order']   = 'ASC';
  }

  return $args;
}
add_filter('bbp_before_has_topics_parse_args', 'my_custom_display_topic_index_query ' );

「$thisforumid」に並び順を変更したいフォーラムのID(フォーラム一覧でタイトルにマウスオーバーで分かります)をいれてあげればOK。

参考:WordPress forum

WP ページ一覧の取得方法まとめ

WPでサイトを作るとき、簡単なブログサイトならウィジェットで事足りるのですが、コーポレートサイト等になるとそうはいきません。
規模が大きくなると、サイドバーで親ページに属する子ページのみの一覧を表示・・・なんてざらです。

なので、実際の案件で使ったことがあるページ一覧の取得方法をメモ。

特定のページに属する子ページ一覧を表示

<?php global $post;
$args = array(
	'post_type' => 'page',
	'sort_order' => 'asc',
	'sort_column' => 'menu_order',
	'child_of' => 616 //親ページのID
);
$myposts = get_pages( $args );

foreach( $myposts as $post ) :  setup_postdata($post);?>
<li><a href="<?php the_permalink(); ?>" title="<?php the_title() ?>"><?php the_title() ?></a></li>
<?php endforeach; ?>
</ul>

親ページにいる時は子ページ一覧を、
子ページにいるときは自分の親に属する子ページ一覧を表示

<a href="<?php
   $permalink = get_permalink($post->post_parent);
   echo $permalink;
?>" title="<?php the_title(); ?>">
<?php
   $parent_title = get_the_title($post->post_parent);
   echo $parent_title;
?>
</a></h3>
<?php
  if($post->post_parent)
  $children = wp_list_pages("sort_column=menu_order&title_li=&child_of=".$post->post_parent."&echo=0");
  else
  $children = wp_list_pages("sort_column=menu_order&title_li=&child_of=".$post->ID."&echo=0");
  if ($children) { ?>
  <ul>
  <?php echo $children; ?>
  </ul>
  <?php } ?>

参考サイト:<?php wp_list_categories( パラメータ ); ?>(wp-design.jp様)

WPでサイトでコーポレートサイトをつくる時に役立つサイト

このサイトを見てやっと、条件分岐の記述の意味を理解しました。感謝!!
意味がわかると作業スピードが格段にアップしますね。
もう覚えなくても大丈夫!?WordPressの条件分岐タグの使い方まとめ(OXY NOTES様)

固定ページ一覧表示の書き方いろいろまとめ。
子ページを駆使したり、ボリュームの多いサイトを扱うときに便利!とても!!
トップや固定ページに指定IDの固定ページ一覧や指定階層の固定ページ一覧を出力する方法(stronghold様)

topへ戻るJS


JS部分

<script type="text/javascript">
$(document).ready(function(){
// hide #back-top first
$("#back-top").hide();  
// fade in #back-top
$(function () {
$(window).scroll(function () {
if ($(this).scrollTop() > 300) {
$('#back-top').fadeIn();
} else {
$('#back-top').fadeOut();
}
});
// scroll body to 0px on click
$('#back-top a').click(function () {
$('body,html').animate({
scrollTop: 0
}, 1000);
return false;
});
});
});
</script>

HTML部分

<p id="back-top" style="display: block;">
<a href="#header"><span><img src="../img/totop.png" alt="ページトップへ戻る"></span></a>
</p>

CSS部分

にょきっと下から出てくるエフェクト

#back-top {
position: fixed;
bottom: -8%;
right: 3%;
-webkit-transition: all 0.2s ease;
-moz-transition: all 0.2s ease;
-ms-transition: all 0.2s ease;
-o-transition: all 0.2s ease;
transition: all 0.2s ease;
}
#back-top:hover {
bottom: 0%;
}
#back-top span {
width: 65px;
height: 134px;
display: block;
}