Moral Hazard!!

ドラマーが音楽やホームページやガラクタを作るよ。

カスタム投稿でアーカイブページを作った時の分岐方法。

No Comment wordpress

wordpress3.1からカスタム投稿タイプを設定する時に、register_post_typeに「'has_archive' => true」を設定する事で、カスタム投稿用のアーカイブページがスラッグ名で作れるようになってる。

カスタム投稿タイプの設定方法

そして最近は「pre_get_posts」「is_main_query」を使って、メインのループを
「テンプレートがスッキリ綺麗」

「クエリ数が減らして速度UP」
なんて書き方がクールだとかなんとか。

ちなみに「カスタム投稿のアーカイブページ」を分岐するのには
is_post_type_archive('投稿タイプ名')
を使う。

function main_loop_check( $wp_query ) {
	if ($wp_query->is_main_query() && is_post_type_archive('movie')) {
        $wp_query->set('posts_per_page','10');
	$wp_query->set('order','ASC');
    }
}
add_action( 'pre_get_posts', 'main_loop_check' );

とすると、投稿タイプ「movie」のアーカイブテンプレートは

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<h2><?php the_title();?></h2>
<?php the_content(); ?>
<?php endwhile; endif; ?>

とquery_postsなど書かなくても反映される。

素敵。

wp_mailでBccが届かなくて焦った件(Gmail)

No Comment wordpress,サイト製作,,

wp_mail()を使って簡単にメールフォームを作ろうと思ったら、ヘッダの引数にBccを指定した途端に届かない!Ccには届く!という摩訶不思議な現象に困った。

wp_mail()の基本設定(公式リファレンス)

$to = 'mail@mail.com';
$subject = 'タイトル';
$headers[] = 'From: 送信元名前 <sousinmoto@mail.com>';
$headers[] = 'Cc: Cc宛先<ccatesaki@gmail.com>';
$headers[] = 'Bcc: Bcc宛先<bccatesaki@gmail.com>';
$message = '本文'

wp_mail($to,$subject,$message,$headers);

と書けば送信先、Cc、Bccを含んだメール送信が可能なわけだ。簡単。
Ccとかいらね!って場合は第4引数(アタッチメント、この場合はヘッダ)を除いたらいい。

単に送信先を複数にしたければ、

$to = array('mail@mail.com','second-mail@mail.com');

と配列にすればOK。

とにかくシンプルに!って時はソースに

wp_mail('mail@mail.com','タイトル','本文');

これ書くで届く。素晴らしい。
で、何故か自分の環境ではBccだけが届かない。

おかしいな?と調べたところ、Gmailでは送信先とBccを同じGmail受信ボックスで受信した場合、重複を防ぐためかBccをPopしないようだ。

つまり僕は、同じGmailアカウントで2つのメール、「mail@mail.com」「bccatesaki@gmail.com」を受信していたので、mail@mail.comだけが受信された形になっていた。

なので、試しにBccのみGmailアカウントで受信してみたら、「非公開の受信者宛」という宛先でこのメールが届いた。(Googleに詳細)

送信テストする時は注意しないとね。

contact form 7で携帯でリダイレクトする方法

No Comment wordpress

ブックマーク先が消えてたので、慌ててキャッシュからメモっておく。

wordpressの携帯用ページでリダイレクトする方法は…

$_SERVER["REQUEST_URI"] = "/request-send";

と、REQUEST_URI を飛ばしたいURIに書き換える。

これを書き換えるタイミングを送信直前のフック「wpcf7_before_send_mail」で行うため、finction.phpに書くではなく、自作のプラグインを作って以下を記述。

add_action( 'wpcf7_before_send_mail', 'my_conversion' );

function my_conversion( $cf7 )
{
	// 申し込みフォームIDによって飛ばすページを振り分けたいならIDをチェック
	if( $cf7->id == 1 )
	{
		$_SERVER["REQUEST_URI"] = "/request-send";
	}
}

申し込みフォームIDは contact form 7 のタグが

[contact-form 1 "フォーム"]
(カッコを全角に変更してます)となっていればIDは1だ、そうで。

Contact Form 7の特別なメールタグをfunctions.phpで追加

4 Comments wordpress,

wordpressでバンドサイトを作る際、ライブチケットのメール予約なんかで、公演日のページから直接メールフォームでチケット予約をさせたい。
僕の場合は、カスタムフィールドに作った公演日、[live_date]の値をContact Form 7で送信したい。

やりたいこと↓

・wordpressのメール送信プラグインContact Form 7で、投稿のカスタムフィールドの値を送信したい。
・Contact Form 7をいじらず、functions.phpだけで対応したい。
(直接contactform7内に書くと、アップデートで消えてしまうから)

まずContact Form 7の管理ページで、メッセージ本文にショートタグ[live_date_check]を追加。

次に、functions.php内に

add_filter('wpcf7_special_mail_tags', 'my_special_mail_tags',10,2);

function my_special_mail_tags($output, $name)
{
	if ( ! isset( $_POST['_wpcf7_unit_tag'] ) || empty( $_POST['_wpcf7_unit_tag'] ) )
		return $output;
	if ( ! preg_match( '/^wpcf7-f(\d+)-p(\d+)-o(\d+)$/', $_POST['_wpcf7_unit_tag'], $matches ) )
		return $output;

	$post_id = (int) $matches[2];
	if ( ! $post = get_post( $post_id ) )
		return $output;
	$name = preg_replace( '/^wpcf7\./', '_', $name );

	if ( 'live_date_check' == $name )
		$output = get_post_meta($post->ID,live_date,true);
	return $output;
}

と記述し、wpcf7_special_mail_tagsをフックする。
(live_dateがカスタムフィールドのキーで、live_date_checkというショートタグで出力)

ついでにメールでのトラブル解決用に、送信元のIPアドレスとUser Agentなんかも仕込んでおけばばっちり。

add_filter('wpcf7_special_mail_tags', 'my_special_mail_tags',10,2);

function my_special_mail_tags($output, $name)
{
	//UAとIPを追加
	if(!isset($re_agent)){ $re_agent = $_SERVER['HTTP_USER_AGENT']; }
	if('user_agent' == $name){ $output = $re_agent; }
	if(!isset($re_addr)){ $re_addr = $_SERVER['REMOTE_ADDR']; }
	if('remote_addr' == $name){ $output = gethostbyaddr($re_addr); }

	//特別なタグを追加
	if ( ! isset( $_POST['_wpcf7_unit_tag'] ) || empty( $_POST['_wpcf7_unit_tag'] ) )
		return $output;
	if ( ! preg_match( '/^wpcf7-f(\d+)-p(\d+)-o(\d+)$/', $_POST['_wpcf7_unit_tag'], $matches ) )
		return $output;

	$post_id = (int) $matches[2];
	if ( ! $post = get_post( $post_id ) )
		return $output;

	$name = preg_replace( '/^wpcf7\./', '_', $name );

	if ( 'live_date_check' == $name )
		$output = get_post_meta($post->ID,live_date,true);
	return $output;
}

込み込みでこんな感じ。

参考(感謝)

WordPress ContactForm7の特別なメールタグを追加する方法
Contact Form 7 でユーザーエージェント

ヘッダに書き出されるmeta情報の削除方法と意味

4 Comments wordpress,

wordpressがヘッダに勝手に書き出す情報。
中にはこんな感じで

<meta name="generator" content="WordPress 2.9.2" />

wordpressのヴァージョンがソースのヘッダに書き出されるので、不細工だとか、セキリュティ的にもよくないという事で消す事も多い。
3.0でさらに増えたこれらメタ情報を削除するには、テーマ内のfunction.phpに

remove_action( 'wp_head', 'wp_generator' );
remove_action( 'wp_head', 'wlwmanifest_link' );
remove_action( 'wp_head', 'rsd_link' );
remove_action('wp_head', 'rel_canonical');
remove_action( 'wp_head', 'index_rel_link' );
remove_action( 'wp_head', 'feed_links_extra', 3 );
remove_action( 'wp_head', 'feed_links', 2 );
remove_action( 'wp_head', 'parent_post_rel_link', 10, 0 );
remove_action( 'wp_head', 'start_post_rel_link', 10, 0 );
remove_action( 'wp_head', 'adjacent_posts_rel_link', 10, 0 );

と入れる。
各引数の意味はこんな感じ。
・wp_generator
wordpressのヴァージョンを表示する。ただ削除したところで、WordPress のセキュリティーホールは XML-RPC 関連に集中しているため、セキリュティ向上にはつながらないという話も。(→ソース)
・wlwmanifest_link
Windows Live Writer を使ってブログ投稿をする時に使用。
・rsd_link
外部アプリケーションから情報を取得するためのプロトコル「RSD(Really Simple Discovery)」のリンクを吐き出す。ブログ投稿ツールを使っている時には必要。
・rel_canonical
URL正規化タグ。複数の類似した内容のページの中で優先されるページを指定できる。
・index_rel_link
linkタグを出力。出力されたリンク先が、現在の文書に対する「索引(インデックス)」であることを示す。
・feed_links
サイト全体へのfeedを出力する。
・feed_links_extra
その他のフィード(カテゴリー等)へのリンクを表示
・parent_post_rel_link、start_post_rel_link、adjacent_posts_rel_link
ブラウザが先読みするためlink rel="next"などのタグを吐き出す。FireFoxなどではサーバーかける負荷があがるとも。
削除すると、FireFoxプラグインのAutoPagenizeは動作しなくなる(ここから出力される情報を元にリンク先を取りに行くので)

とりあえずCMSとしてwordpressを使う分には、wp_generator、wlwmanifest_link、rsd_link、parent_post_rel_link~を削除しておくと憂いはなさそう。