Moral Hazard!!

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

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~を削除しておくと憂いはなさそう。

各記事のカテゴリ名を取得する方法

No Comment wordpress

やりたいこと・・・ループ内でカテゴリ名が「オススメ」の時だけ「オススメ記事」という文字列を出力する。

<?php if(have_posts()) : ?>
<?php while(have_posts()) : the_post(); ?>
<li>
<a href="<?php the_permalink();?>"><?php the_title();?></a>
<?php foreach((get_the_category()) as $cat){
$catName = $cat->name;
if($catName == 'オススメ') {echo "オススメ記事";}
} ?>
</li>
<?php endwhile ; else : ?>
<p>記事が見つかりません。</p>
<?php endif;?>

※何故foreachを使うか?
get_the_category()で取得したデータは「stdClass Object」というクラスオブジェクト。
これにprint_rをかけると

Array
(
    [0] => stdClass Object
        (
            [term_id] => 53
            [name] => オススメ記事
            [slug] => asdasd
            [term_group] => 0
            [term_taxonomy_id] => 54
            [taxonomy] => category
            [description] => 説明
            [parent] => 0
            [count] => 13
            [object_id] => 1147
            [cat_ID] => 53
            [category_count] => 13
            [category_description] => 説明
            [category_nicename] => asdasd
            [category_parent] => 0
        )

    [1] => stdClass Object
        (
            [term_id] => 16
            [name] => 普通の記事
            [slug] => asdasd
            [term_group] => 0
            [term_taxonomy_id] => 16
            [taxonomy] => category
            [description] =>
            [parent] => 44
            [count] => 5
            [object_id] => 1147
            [cat_ID] => 16
            [category_count] => 5
            [category_description] =>
            [cat_name] =>普通の記事
            [category_nicename] => asdasd
            [category_parent] => 44
        )

)

のように、配列の中にstdClass Objectとして格納されていることが分かる。
(多次元配列ではない)
classの中の変数「メンバ変数」を取り出すには、「->(アロー演算子)」を使う。
例えば一つしかカテゴリに属していないとして、その中からnameを取り出すには、

$catData = get_the_category();
$catName = $catData[0]->name;
echo $catName;

としてやればいいが、実際はカテゴリの数だけ配列が増えるので、foreachを使って

<?php foreach((get_the_category()) as $cat){
$catName = $cat->name;
if($catName == 'オススメ') {echo "オススメ記事";}
} ?>

とする。
すると配列[0][1][2]...と順番に処理されていき、nameが「オススメ」という文字列なら、「オススメ記事」が表示される。

参考
foreach文
クラスとオブジェクト
多次元配列
stdClass Object

Custom Field GUI Utilityのcheckbox

No Comment wordpress

Custom Field GUI Utilityのcheckbox項目はデフォルトでチェックされている。
これはconfig.iniのcheckbox項目に

[checkbox]
fieldname = チェックボックス(共通表示)
type = checkbox
class = post page
default = checked
sample = input the caption

とあるが、このdefault = checkedを削除すればデフォルトでチェックが入っていない状態になる。
念のため。

no future postsで未来の投稿を表示させたい

1 Comment wordpress,,

やりたいこと・・・投稿日付が未来の予約投稿を、wordpressに表示させたい。

「no future posts」というプラグインを使う。
最近wordpress3.01に対応したようだ。

・functions.phpに以下を追加する。
僕はwordpress3.0にアップデートしたタイミングで上記no future postsが対応していなかったため、こちらを使っている。

function forced_publish_future_post( $data, $postarr ) {
	if ( $data['post_status'] == 'future' && $postarr['post_status'] == 'publish' ) {
		$data['post_status'] = 'publish';
	}
	return $data;
}
add_filter( 'wp_insert_post_data', 'forced_publish_future_post', 10, 2 );

future_to_publishを使う
フォーラムに載っていたが、予約投稿の記事ごとに公開するかどうか決められるらしい。
便利そう。