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など書かなくても反映される。
素敵。
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 でユーザーエージェント
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~を削除しておくと憂いはなさそう。
やりたいこと・・・投稿日付が未来の予約投稿を、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を使う
フォーラムに載っていたが、予約投稿の記事ごとに公開するかどうか決められるらしい。
便利そう。
wordpressが3.0になって、デフォルトのテーマ「Twenty Ten」がなんかイケてる。
特にメニューや背景、ヘッダをwordpress上で変更出来るのが素敵。
ブログやりたい!でも広告ウザい!とか言う人は、php分からなくてもちょっと頑張ったら作れるよ!
で、新しくメニュー入りのテーマを作ろうと思ったが、ちょっとはまったのでメモ。
自作テーマにメニューをメニューを追加する場合、表示させたい場所に
<?php wp_nav_menu(); ?>
を追加。そしてfunctions.phpに
add_theme_support( 'nav-menus' );
を追加する。
のだが、実際にこれだけ追加した場合、「外観」に「メニュー」の設定項目が表示されない事がある。
サイト自体にはメニューは表示されるけど、編集できない。Oh!
原因は、テーマがウィジェットに対応していないから。
つまり、functions.phpに
if ( function_exists('register_sidebar') )
register_sidebar();
とウィジェットに対応させると、外観メニュー項目が表示されるようになる。
ちなみに、サイドバー(sidebar.php)を作らなくても表示される。