WordPress に様々な投稿タイプを追加することができるカスタム投稿タイプや、カテゴリやタグのような分類を追加することができるカスタム分類。これを管理画面から設定できるプラグインとして、有名なもので Custom Post Type UI や Custom Post Type Generator などがあります。

これまで、Custom Post Type Generator を使っていましたが、先日バージョン 2.3.0 が公開され、これに更新したらカスタム投稿タイプやカスタム分類のラベルが消えて名前(スラッグ)と同じになり、管理画面のメニューからも消え、カスタム分類アーカイブのパーマリンクも変わってしまいました。こういうことがあるから、出来るだけプラグインを使わない方がいいんですね。

これを機に、これまで構築したサイトも含め、カスタム投稿タイプとカスタム分類についてプラグインの使用をやめ、function.php で定義する方法に変更しました。

既に function.php には様々な記述をしているため、管理しやすいように custom-post-type.php というファイルを作ってこれに記述し、function.php に読み込むようにしています。(custom-post-type.php の記述はこの記事の最後に記載)

いくつかのサイトを同じようにしてプラグインから function.php による定義に変更していきましたが、一つだけマルチサイト機能を使って複数のサイトを作り、それぞれに異なるカスタム投稿タイプを設定しているサイトがありました。

プラグインを使用していた時は、それぞれのサイトで個別にカスタム投稿タイプが作成されましたが、function.php で定義するとすべてのサイトに一括で作成されます。(マルチサイトの種類によっては、その方が都合がいい場合もあると思いますが)

そこで、前述の custom-post-type.php をそれぞれのサイトに合わせて複数用意し、function.php で読み込むファイルを各サイトの blog ID で切り分けることにしました。

global $current_blog;
$blog_id = $current_blog->blog_id;
if ($blog_id == 1 ){
  include( TEMPLATEPATH. '/inc/custom-post-type-a.php' );
} elseif ($blog_id == 2 ){
  include( TEMPLATEPATH. '/inc/custom-post-type-b.php' );
} elseif ($blog_id == 3 ){
  include( TEMPLATEPATH. '/inc/custom-post-type-c.php' );
} elseif ($blog_id == 4 ){
  include( TEMPLATEPATH. '/inc/custom-post-type-d.php' );
}

なお、カスタム投稿タイプとカスタム分類を定義する記述は以下のとおりです。シンプルに必要な項目だけを記述してもいいのですが、今後の機能変更や流用などを考慮して、WordPress Codex を参考にして細かく記述しています。

<?php
add_action('init', 'create_post_type');
function create_post_type(){

  // カスタム投稿タイプ:フロントエンドエンジニアのblog
  $labels = array(
    'name' => _x('フロントエンドエンジニアのblog', 'post type general name'),
    'singular_name' => _x('フロントエンドエンジニアのblog', 'post type singular name'),
    'menu_name' => _x('エンジニアblog', 'admin menu'),
    'name_admin_bar' => _x('エンジニアblog', 'add new on admin bar'),
    'add_new' => _x('新規追加','blog'),
    'add_new_item' => __('新規blog記事を追加'),
    'new_item' => __('新規blog記事'),
    'edit_item' => __('blog記事の編集'),
    'view_item' => __('blog記事を表示'),
    'all_items' => __('blog記事一覧'),
    'search_items' => __('blog記事を検索'),
    'parent_item_colon' => '',
    'not_found' => __('blog記事が見つかりませんでした。'),
    'not_found_in_trash' => __('ゴミ箱内にblog記事が見つかりませんでした。'),
  );
  $args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'exclude_from_search' => false,
    'query_var' => true,
    'rewrite' => array('slug' => '', 'with_front' => false),
    'capability_type' => 'post',
    'has_archive' => true,
    'hierarchical' => false,
    'menu_position' => 20,
    'supports' => array('title', 'editor', 'thumbnail', 'author', 'trackbacks', 'comments', 'revisions'),
  );
  register_post_type('blog', $args);
 
  //カスタムタクソノミー:blogカテゴリー
  $labels = array(
    'name' => _x( 'カテゴリー', 'taxonomy general name' ),
    'singular_name' => _x( 'カテゴリー', 'taxonomy singular name' ),
    'add_new_item' => __( '新規カテゴリーを追加' ),
    'edit_item' => __( 'カテゴリーの編集' ),
    'update_item' => __( 'カテゴリーを更新' ),
    'search_items' => __( 'カテゴリーを検索' ),
  );
  $args = array(
    'labels' => $labels,
    'public' => true,
    'show_ui' => true,
    'show_admin_column' => true,
    'rewrite' => array('slug' => 'blog', 'with_front' => false),
    'hierarchical' => true,
    'update_count_callback' => '_update_post_term_count',
  );
  register_taxonomy('blog_category', 'blog', $args);

}
?>

一度フォーマットを作ってしまえば、プラグインを利用するよりこちらの方が簡単ですね。