カスタム投稿タイプ ・カスタムフィールド・カスタムタクソノミー : WordPress


カスタムタクソノミー(カスタム分類)とカスタムフィールドをカスタム投稿タイプで利用するための覚書。

目次

カスタム投稿タイプ(Custom Post Type)

WordPress はデフォルトで5つの投稿タイプを持つ(post:投稿, ページ:page, 添付ファイル:attachment, リビジョン :revision, ナビゲーションメニュー :nav_menu)[1]
さらにWordPress3.0は独自に投稿タイプを設定するカスタム投稿タイプと呼ばれる機能を導入した。

» 投稿タイプ – WordPress Codex 日本語版

カスタム投稿タイプの定義

カスタム投稿タイプはfunction.phpにアクションとして登録する。基本的なコードは下記のようになる。

/**
* カスタム投稿タイプ example
*/
add_action('init', 'create_example');
function create_example(){
    $labels = array(
        'name' => 'サンプル',
        'singular_name' => 'サンプル',
        'add_new' => 'サンプルを追加',
        'add_new_item' => '新しいサンプルを追加',
        'edit_item' => 'サンプルを編集',
        'new_item' => '新しいサンプル',
        'view_item' => 'サンプルを編集',
        'search_items' => 'サンプルを探す',
        'not_found' => 'サンプルはありません',
        'not_found_in_trash' => 'ゴミ箱にサンプルはありません',
        'parent_item_colon' => ''
    );
    $args = array(
        'labels' => $labels,
        'public' => true,
        'capability_type' => 'post',
        'hierarchical' => false,
        'has_archive' => true,
        'supports' => array(
            'title',
            'editor'
        ),
        'register_meta_box_cb' => 'example_meta_box'     // カスタムフィールドを使う場合
    );
    register_post_type('example', $args);
}

» Gist

» 関数リファレンス/register post type – WordPress Codex 日本語版

カスタム投稿タイプのデフォルトのテンプレートはsingle.php。
専用のテンプレートを適用する場合はsingle-カスタム投稿名.phpとする。

カスタム投稿タイプはカテゴリーを利用しないのでarchive.phpなどではアーカイブを表示しない。カスタム投稿タイプのアーカイブを表示する詳細はカスタム投稿タイプ アーカイブページ : WordPressを参照。

追記 2011.08.15 WP3.1以降はアーカイブを利用できるようになった。
register_post_typeの引数に’has_archive’ => trueを追加。テンプレートはarchive-カスタム投稿名.phpとする。
» WordPressのカスタム投稿(ポスト)タイプを作成するまでの手順リスト – かちびと.net

カスタムタクソノミー/カスタム分類(Custom Taxonomy)

カスタム投稿タイプにもカスタムタクソノミーを使うことによって通常の投稿(post:投稿)におけるカテゴリーやタグの機能を持たせることができる[2]

カスタムタクソノミーの登録

カスタムタクソノミーの登録はfunction.phpでregister_taxonomy関数を実行する。基本コードを下記のようになる。

» 関数リファレンス/register taxonomy – WordPress Codex 日本語版

// カスタムタクソノミーを登録
register_taxonomy(
    'example_tax', // カスタムタクソノミー名
    'example', // 投稿タイプの指定
    array(
        'hierarchical' => true, // trueの場合はカテゴリーのように表示
        'update_count_callback' => '_update_post_term_count',
        'label' => '分類',
        'singular_label' => '分類',
        'public' => true,
    )
);

» Gist

_update_post_term_countはwp-includes/taxonomy.phpで定義されている。またlabelとsinglur_labelの違いは単数形と複数刑の違い。日本語では殆んど気にする必要はない。

カスタムフィールド

カスタム投稿タイプでカスタムフィールドを使う方法を記載する[3]

add_meta_box

» 関数リファレンス/add meta box – WordPress Codex 日本語版

// カスタムフィールド
function example_meta_box($post){
    add_meta_box(
        'example_meta',
        '設定欄',
        'example_meta_callback',
        'example',
        'normal',
        'high'
    );
}
function example_meta_callback($post, $box){
    // カスタムフィールドの値を取得
    $field1 = get_post_meta($post->ID, 'field1', true);
    $field2 = get_post_meta($post->ID, 'field2', true);
    //
    echo wp_nonce_field('example_meta', 'my_meta_nonce');
    // 入力域
    echo 'field1:<input type="text" name="field1" value="' . $field1 . '" /><br />';
    echo 'field2:<input type="text" name="field2" value="' . $field2 . '" />';
}
// 保存処理
add_action('save_post', 'example_meta_update');
function example_meta_update($post_id){
    if (!wp_verify_nonce( $_POST['my_meta_nonce'], 'example_meta')) {
        return $post_id;
    }
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return $post_id;
    }
    if ('example' == $_POST['post_type']) {
        if(!current_user_can('edit_post', $post_id)) {
            return $post_id;
        }
    } else {
        return $post_id;
    }
    $field1 = $_POST['field1'];
    $field2 = $_POST['field2'];
    if($field1 == '') {
        delete_post_meta($post_id, 'field1');
    }
    else {
        update_post_meta($post_id, 'field1', $field1);
    }
    if($field2 == '') {
        delete_post_meta($post_id, 'field2');
    }
    else {
        update_post_meta($post_id, 'field2', $field2);
    }
}

カスタムフィールドの値の更新・削除・追加

» 関数リファレンス/update post meta – WordPress Codex 日本語版
» 関数リファレンス/delete post meta – WordPress Codex 日本語版[4]

» 関数リファレンス/wp nonce field – WordPress Codex 日本語版
» 関数リファレンス/wp verify nonce – WordPress Codex 日本語版

プラグイン

管理画面(UI)でカスタム投稿タイプとカスタムタクソノミーを設定可能なプラグイン。
» WordPress › Custom Post Type UI « WordPress Plugins

Custom Field GUI Utility 3をカスタム投稿タイプで使う

下記の記事に簡単にカスタムフィールドを作成するプラグインとして有名なCustom Field GUI Utility 3をカスタム投稿タイプで利用する方法が説明されている。
» Custom Field GUI Utilityプラグインをカスタム投稿タイプの投稿ページで使いた

簡単な例


 __('Exsamples'),
        'singular_label' => __('Exsample'),
        'public' => true,
        'supports' => array(
            'title',
            'custom-fields'
        )
    ));
}
add_action( 'init', 'create_my_post_types' );
?>

supportプロパティに’custom-fields’を設定する。Custom Field GUI Utility 3の設定ファイルconf.iniのclassの値をカスタム投稿タイプと揃える。


[imagefield]
fieldname = 画像(共通表示)
type = imagefield
class = cpt_example
size = 35
sample = input the example or the caption
must = 1

カスタム投稿タイプexampleの投稿画面だけにimagefieldがカスタムフィールドに表示される。

追記


追記 2011.04.12 パーマリンク設定のカスタム構造を下記のように設定にした場合、カスタム投稿タイプ・カスタムタクソノミーはうまく動作しなかった。
/%category%/%post_id%.html
追記2 2011.04.12 下記の場合は動作した。
/%category%/%postname%.html

1. 投稿タイプ – WordPress Codex 日本語版を参照。
2. 通常の投稿はカテゴリーを設定すると投稿の際に選択できる。しかしカスタム投稿タイプではカテゴリーは表示されない。
3. カスタム投稿タイプだけでなくその他の投稿タイプの場合も同じ方法でカスタムフィールドをfunction.phpで設定できる。
4. カスタムフィールを操作する他の代表的な関数として関数リファレンス/add post meta – WordPress Codex 日本語版がある。

コメント

No comments yet.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。