こしあん日記 ~写真と猫とサッカーと~

子供たちの記録用にはじめたが、思春期になり写真を撮らせてもらえなくなる。写真と愛猫とサッカーが中心のブログです。

カスタム投稿タイプの設定方法

Wordpressにはカスタム投稿タイプという仕組みがある。 元々ブログツールのWordpressには主に「投稿」という仕組みがあります。これはブログの記事を書いて登録する仕組みです。 ただ、ブログといっても全部記事というわけではなく、コンテンツがほとんど変わらないページがあります。例えば「ブログの管理者について」などはそんなページになります。 投稿で記事として登録すると新しい記事が来ると流れてしまいます。このためWordpressには「固定ページ」という概念もあります。

「投稿」と「固定ページ」は見せ方が違うだけで、登録するインターフェイスは全く同じです。 タイトル欄、記事投稿欄、概要欄、トラックバック欄等。 しかし、投稿する内容によては、記入する項目が決まっていたほうが、見る側も見やすく投稿する側も投稿しやすい場合があり、普通の投稿のインターフェイスと変えたい場合があるかもしれません。そういう時に使えるのがカスタム投稿タイプです。

私の場合は本や映画をよく見ます。でもどの本がどんな内容だったのか、最悪読んだかどうかもメモをしないと忘れます。映画も同じです。 しかし、ちゃんと登録できているかというと、まったくできていません。通常のWordpressの投稿で対応するには面倒臭すぎるからです。

そこで、カスタム投稿タイプで読んだ本、見た映画を投稿できる口を作ろうと思います。 必要な項目は 1.タイトル 2.アイキャッチ画像 3.トラックバック 4.カテゴリー で、あとでカスタムフィールドで著者、出版社、感想を入れる欄を作ります。

カスタム投稿タイプはプラグインでの設定が簡単ですが、最近サイト表示速度がかなり遅くプラグインの影響も受けてそうでプラグイン不信なので、自分で書きます。 themesフォルダの各テーマ内のfunctions.phpに書いてください。

add_action( 'init', 'create_post_type' );
 
function create_post_type() {
 
    $labels = array(
        'name' => _x( '本', 'fbook' ),
        'singular_name' => _x( '本', 'fbook' ),
        'add_new' => _x( '新規追加', 'fbook' ),
        'add_new_item' => _x( '新しい本を追加', 'fbook' ),
        'edit_item' => _x( '本を編集', 'fbook' ),
        'new_item' => _x( '新しい本', 'fbook' ),
        'view_item' => _x( '本を見る', 'fbook' ),
        'search_items' => _x( '本検索', 'fbook' ),
        'not_found' => _x( '本が見つかりません', 'fbook' ),
        'not_found_in_trash' => _x( 'ゴミ箱に本はありません', 'fbook' ),
        'parent_item_colon' => _x( '親本:', 'fbook' ),
        'menu_name' => _x( '本', 'fbook' ),
    );
 
    $args = array(
        'labels' => $labels,
        'hierarchical' => true,
        'description' => '本の登録について',
        'supports' => array( 'title', 'thumbnail', 'trackbacks', 'comments' ),
        
        'taxonomies' => array( 'category' ),
        'public' => true,
        'show_ui' => true,
        'show_in_menu' => true,
        
        'show_in_nav_menus' => true,
        'publicly_queryable' => true,
        'exclude_from_search' => false,
        'has_archive' => true,
        'query_var' => true,
        'can_export' => true,
        'rewrite' => true,
        'capability_type' => 'post'
    );
 
    register_post_type( 'fbook', $args );
}

$labels変数には管理画面での表示を配列で格納しています。「本」を別の記述に変えて使ってください。 $args変数はカスタム投稿タイプの設定内容を配列で格納しています。細かい部分はCODEXを確認してください。

2箇所だけ説明します。

supportsの部分でどの機能を使うか決めます。エディタが欲しい場合はeditorを追加します。こちらも細かい内容はCODEXで確認してください。今回はタイトル、アイキャッチ画像、トラックバック、コメント欄だけです。 もう一つはtaxonomiesです。ここではタグ、カテゴリー、カスタムタクソノミーが選択できます。私は既存のカテゴリーを流用するためにcategoryを入れています。

次にアイキャッチ画像を利用できるように設定します。

add_theme_support( 'post-thumbnails', array( 'fbook', 'fmovie' ) );
set_post_thumbnail_size( 420, 280, true );

管理画面のメニューにこのカスタム投稿タイプが追加されますが、そのメニューのアイコンを設定します。

function add_menu_icons_styles(){
     echo '<style>
          #adminmenu #menu-posts-fbook div.wp-menu-image:before {
               content: "\f331";
          }
     </style>';
}
add_action( 'admin_head', 'add_menu_icons_styles' );

アイコンフォントのNoはこちらから選択してください。

次に、前回説明したカスタムフィールドの設定です。

function add_fbook_fields() {
    add_meta_box( 'fbook_setting', '本の情報', 'insert_fbook_fields', 'fbook', 'normal');
}
add_action('admin_menu', 'add_fbook_fields');

function insert_fbook_fields() {
    global $post;
 
    echo '<dl style="display:flex"><dt style="width:100px">著者:</dt><dd><input type="text" name="fbook_author" value="'.get_post_meta($post->ID, 'fbook_author', true).'" size="75" /></dd></dl>';
    echo '<dl style="display:flex"><dt style="width:100px">出版社:</dt><dd><input type="text" name="fbook_publish" value="'.get_post_meta($post->ID, 'fbook_publish', true).'" size="75" /></dd></dl>';
    echo '<dl style="display:flex"><dt style="width:100px">感想等:</dt><dd><textarea name="fbook_impressions" value="'.get_post_meta($post->ID, 'fbook_impressions', true).'" cols="70" rows="5"></textarea></dd></dl>';
}

function save_fbook_fields( $post_id ) {
    if(!empty($_POST['fbook_author'])){
        update_post_meta($post_id, 'fbook_author', $_POST['fbook_author'] );
    }else{
        delete_post_meta($post_id, 'fbook_author');
    }
    
    if(!empty($_POST['fbook_publish'])){
        update_post_meta($post_id, 'fbook_publish', $_POST['fbook_publish'] );
    }else{
        delete_post_meta($post_id, 'fbook_publish');
    }
    
    if(!empty($_POST['fbook_impressions'])){
        update_post_meta($post_id, 'fbook_impressions', $_POST['fbook_impressions'] );
    }else{
        delete_post_meta($post_id, 'fbook_impressions');
    }
}
add_action('save_post', 'save_fbook_fields');

function fbookpub() {
    add_post_type_support( 'fbook', 'publicize' );
}
add_action( 'init', 'fbookpub' );

前回との違いはmeta_boxの4つ目の引数をpostではなくカスタム投稿タイプのスラッグを設定します。 一応管理画面およびDBはこれで完成(のはず)。 表示はまだ作れていないので、また後日説明します。