第2回 WordBench Kobe(神戸)で、カスタム投稿タイプとカスタム分類について喋りました。
ワードプレス内部では、投稿、ページ、メディアが実は同じテーブルに格納されています。post_type で区別されます。
この post_type の部分を設定することができます。勉強会では「イベント」という投稿タイプ、「地区」という分類を作る例を取り上げました。
今までだと、カテゴリーで「イベント」を作って対処することが多かったでしょう。カスタム投稿タイプを設定すると、タイトルと本文のみ(トラックバックやアイキャッチ画像無)とか、アイキャッチ画像のみ、といった投稿画面にすることができます。 register_post_type の引数 'supports' => array('title', 'editor', 'excerpt'), の部分で設定できます。
カスタム投稿タイプには、それ専用のカスタム分類を結びつけると便利です。例ではイベントに地区を結びつけています。また、結びつけたカスタム分類を、カスタム投稿の一覧画面に表示させるという管理画面カスタマイズを行っています。manage_events_posts_columns, manage_posts_custom_column の部分です。
カスタム投稿を呼び出すには、WP_Query で、'post_type' => 'events' のように、投稿タイプ名を指定してください。(未来の記事を表示するには、'post_status' => 'future' とすれば可能ですが、未来記事を表示するのは wp 標準ではないのでご注意ください。)
<?php
/*
Plugin Name: Event Post Type
Plugin URI: http://php-web.net/
Description: Event Post Type
Author: Fumito MIZUNO
Version: 2
Author URI: http://php-web.net/
*/
/**
* create_areas_taxonomies
* カスタム分類の作成
*/
function create_areas_taxonomies()
{
$labels = array(
'name' => '地区',
'singular_name' => '地区',
'search_items' => '地区を検索',
'popular_items' => 'おもな地区',
'all_items' => '全ての地区',
'parent_item' => null,
'parent_item_colon' => null,
'edit_item' => __( 'Edit' ),
'update_item' => __( 'Update' ),
'add_new_item' => __( 'Add New' ),
'new_item_name' => __( 'New Name' ),
'separate_items_with_commas' => __( 'Separate items with commas' ),
'add_or_remove_items' => __( 'Add or remove' ),
'choose_from_most_used' => __( 'Choose from the most used' )
);
register_taxonomy('areas','events',array(
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'areas' ),
));
}
add_action('init', 'create_areas_taxonomies');
/**
* post_type_events
* カスタム投稿タイプを追加
*/
function post_type_events() {
$labels = array(
'name' => 'イベント',
'singular_name' => 'イベント',
'add_new' => 'イベント追加',
'add_new_item' => 'イベント追加',
'edit_item' => 'イベント編集',
'view_item' => 'イベント閲覧'
);
register_post_type( 'events', array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,
'capability_type' => 'page',
'supports' => array('title', 'editor', 'excerpt'),
'show_ui' => true ) );
}
add_action('init', 'post_type_events');
/**
* show_event_area
* 投稿一覧のカラム追加
*/
function show_event_area( $defaults ) {
$defaults['areas'] = '地区';
return $defaults;
}
add_filter('manage_events_posts_columns', 'show_event_area', 15, 1);
/**
* show_event_area_id
* カラムでの表示内容
*/
function show_event_area_id($column_name, $id) {
if( $column_name == 'areas' ) {
echo strip_tags( get_the_term_list($id, 'areas') );
}
}
add_action('manage_posts_custom_column', 'show_event_area_id', 15, 2);
カスタム投稿とは直接関係ないのですが、マルチブログに関する質問が出ました。子ブログから一個ずつ新着記事を取ってくる、といったカスタマイズでは、$wpdb->set_blog_id を使って取得しなければならないようです。データベースを見ると、子ブログ毎に異なるテーブルなので、子ブログが多いとかなり負荷がかかりそうです。
後は、WP30 で変更された箇所がソースの何処にあるか分かりにくい、という意見もありました。デフォルトテーマも更新されたので、twentyten の functions.php を見ておくことも必要でしょうね。
現在の wordbench Kobe勉強会参加申し込みについて。コメント欄書き込みなので、人数が少ない場合は良いですが、多いと集計が大変かもしれません。データベーステーブルには、commentmeta が用意されているので、プラグインを作成すれば集計しやすくなるかもしれません。コメントフォームのカスタマイズも必要になりそうですけど。
次回の関西地区勉強会は、10月か11月ぐらいでしょうか。WordCamp 名古屋、KOF の前にするか、後にするか、が問題かもしれません。理想は定期開催ですけど。
[…] 画面カスタマイズです。例によって、テーマのfunctions.phpにコードを記述すればOkです。第二回WordBench神戸ではここまで進みませんでした。第三回WordBench神戸で紹介できたら、と思います。 […]
[…] WordBench神戸 を主催した経験からすると、管理の手間(会場の手配、プロジェクタの準備、参加費徴収等)が省ける(勉強会の内容充実に力を注げる)のは非常に良いと思います。 […]