Mar 4, 2017

おっす、オラJay!
ひっさびさの更新でやり方を忘れちまってたぞ!

今回はチェーン展開の店舗サイトとかショッピングサイトとか、動的なコンテンツが複数ある場合に「カスタム投稿タイプ」でブログを追加する手順を紹介すっぞ。もちろんプラグインは使わねぇ。

カスタム投稿タイプ – wikipediaより
“WordPress は多数の異なるタイプのコンテンツを保存し、表示することができます。投稿はひとつの投稿タイプですが、任意の投稿タイプのコンテンツを WordPress の内部では投稿と呼んでいます。どの投稿タイプのコンテンツもすべてひとつの場所(データベースの wp_posts テーブル)に格納されていて、post_type というカラムによって区別されます。WordPress 3.0 からは自分でカスタム投稿タイプを追加して異なる用途に利用できるようになっています。”


私、プラグインは使ってません(柴咲コウ風に)。


  • 1.functions.phpにコードを追加
  • 2.個別記事のテンプレートを作る
  • 3.全記事一覧や各種アーカイブページを作る
  • 4.もっと強えぇ敵と戦いてぇ!

  • functions.phpに以下のコードを追加


    「グルメレポート」「映画リスト」という2つのブログを追加すると仮定した場合のソースコードです。functions.phpってナニ?という方はプラグインをお使い下さい。探せばいくらでもあります。

    4行目のアルファベット文字列と6、8~11行目の日本語文字列の部分を書き換えます。カテゴリーやタグについても同じ要領で書き換えてください。タグは使わない、という場合はその部分を丸ごと除けばいいだけです。
    //カスタム投稿タイプ「グルメレポート」
    function new_post_type() {
      register_post_type(
        'gourmet',//投稿タイプ名(識別子)
        array(
          'label' => 'グルメレポート',
          'labels' => array(
            'add_new_item' => '新規グルメレポートを追加',
            'edit_item' => 'グルメレポートを編集',
            'view_item' => 'グルメレポートを表示',
            'search_items' => 'グルメレポートを検索',
          ),
          'public' => true,// 管理画面に表示しサイト上にも表示する
          'hierarchicla' => false,//コンテンツを階層構造にするかどうか(投稿記事と同様に時系列に)
          'has_archive' => true,//trueにすると投稿した記事のアーカイブページを生成
          'supports' => array(//記事編集画面に表示する項目を配列で指定することができる
            'title',//タイトル
            'editor',//本文(の編集機能)
            'thumbnail',//アイキャッチ画像
            'custom-fields',
            'excerpt'//抜粋
          ),
          'menu_position' => 5//「投稿」の下に追加
        )
      );
    
    //カスタム投稿タイプ「映画リスト」
      register_post_type(
        'movie',//投稿タイプ名(識別子)
        array(
          'label' => '映画リスト',
          'labels' => array(
            'add_new_item' => '新規映画リストを追加',
            'edit_item' => '映画リストを編集',
            'view_item' => '映画リストを表示',
            'search_items' => '映画リストを検索',
          ),
          'public' => true,// 管理画面に表示しサイト上にも表示する
          'hierarchicla' => false,//コンテンツを階層構造にするかどうか(投稿記事と同様に時系列に)
          'has_archive' => true,//trueにすると投稿した記事のアーカイブページを生成
          'supports' => array(//記事編集画面に表示する項目を配列で指定することができる
            'title',//タイトル
            'editor',//本文(の編集機能)
            'thumbnail',//アイキャッチ画像
            'custom-fields',
            'excerpt'//抜粋
          ),
          'menu_position' => 5//「投稿」の下に追加
        )
      );
     
    //「グルメレポート」のカテゴリー設定
      register_taxonomy(
        'gourmet_cat',
        'gourmet',
        array(
          'label' =>  'グルメレポートカテゴリー',
          'labels' => array(
            'popular_items' => 'よく使うグルメレポートカテゴリー',
            'edit_item' => 'グルメレポートカテゴリーを編集',
            'add_new_item' => '新規グルメレポートカテゴリーを追加',
            'search_items' =>  'グルメレポートカテゴリーを検索',
          ),
          'public' => true,
          'hierarchical' => true,
          'rewrite' => array('slug' => 'gourmet/cat')  //gourmetcat の代わりに gourmet/cat でアクセス(URL)
        )
      );
     
    //「グルメレポート」のタグ設定
      register_taxonomy(
        'gourmet_tag',
        'gourmet',
        array(
          'label' => 'グルメレポートタグ',
          'labels' => array(
            'popular_items' =>  'よく使うグルメレポートタグ',
            'edit_item' =>'グルメレポートタグを編集',
            'add_new_item' => '新規グルメレポートタグを追加',
            'search_items' =>  'グルメレポートタグを検索',
          ),
          'public' => true,
          'hierarchical' => false,
          'rewrite' => array('slug' => 'gourmet/tag')
        )
      );
    
    //「映画リスト」のカテゴリー設定
      register_taxonomy(
        'movie_cat',
        'movie',
        array(
          'label' =>  '映画リストカテゴリー',
          'labels' => array(
            'popular_items' => 'よく使う映画リストカテゴリー',
            'edit_item' => '映画リストカテゴリーを編集',
            'add_new_item' => '新規映画リストカテゴリーを追加',
            'search_items' =>  '映画リストカテゴリーを検索',
          ),
          'public' => true,
          'hierarchical' => true,
          'rewrite' => array('slug' => 'movie/cat')  //moviecat の代わりに movie/cat でアクセス(URL)
        )
      );
     
    //「映画リスト」のタグ設定
      register_taxonomy(
        'movie_tag',
        'movie',
        array(
          'label' => '映画リストタグ',
          'labels' => array(
            'popular_items' =>  'よく使う映画リストタグ',
            'edit_item' =>'映画リストタグを編集',
            'add_new_item' => '新規映画リストタグを追加',
            'search_items' =>  '映画リストタグを検索',
          ),
          'public' => true,
          'hierarchical' => false,
          'rewrite' => array('slug' => 'movie/tag')
        )
      );
     
    }
    add_action('init', 'new_post_type');
    
    このコードを追加して保存した時点で、管理画面のメニューに「グルメレポート」と「映画リスト」が増えています。投稿もできます。楽勝ですね。

    個別記事のテンプレートを作る

    新しく作ったブログ「グルメレポート」の個別記事ページを作ります。このソースコードは僕のサイトの例ですので、お使いの個別記事テンプレート(おそらくはsingle.php)をコピーしてsingle-gourmet.phpのようにリネームしたのち、グレーの部分だけ持って行ってください。書き換えるのは17行目のgourmet_cat(投稿タイプのカテゴリー名)です。
    <?php get_header(); ?>
    
    <!-- wrapここから -->
    <div id="wrap">
    
    <?php get_sidebar(); ?>
    
    <!-- mainここから -->
    <div id="main">
    
    <?php if (have_posts()) : // WordPress ループ
    while (have_posts()) : the_post(); // 繰り返し処理開始 ?>
    <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
    <h3><a href="<?php the_permalink(); ?>"><?php echo get_the_title(); ?></a></h3>
    <p class="post-meta">
    <span class="post-date"><?php echo get_the_date(); ?></span>
    <span class="category">カテゴリ - <?php echo get_the_term_list($post->ID,'gourmet_cat'); ?></span>
    </p>
    <?php the_content(); ?>
    </div>
    <?php endwhile; // 繰り返し処理終了
    else : // ここから記事が見つからなかった場合の処理 ?>
    <div class="post">
    <h2>記事はありません</h2>
    <p>お探しの記事は見つかりませんでした。</p>
    </div>
    <?php endif; // WordPress ループ終了 ?>
    
    <!-- mainここまで -->
    </div>
    
    <!-- wrapここまで -->
    </div>
    
    <?php get_footer(); ?>
    
    デフォルトのsingle.phpでもカスタム投稿タイプの記事を表示できるんですが、タクソノミー(カスタム投稿タイプ毎のカテゴリやタグ)を反映させることができません。それに以降の拡張性を考慮すると、新たに専用の個別記事ページを作っておく方が得策です。

    全記事一覧や各種アーカイブページを作る

    新しく作ったブログ「グルメレポート」のアーカイブ(一覧)ページを作ります。上記の個別記事と同じく僕のサイトの例ですので、アーカイブページテンプレート(おそらくはarchive.php)をコピーしてarchive-gourmet.phpのようにリネームしたのち、グレーの部分だけ持って行ってください。書き換えるのは28行目のページタイトル、39行目のgourmet_cat(投稿タイプのカテゴリー名)です。さらにそのファイルをコピーしてファイル名taxonomy-gourmet_cat.phpのようにリネームするとカテゴリ別や月別のアーカイブにも対応できます。
    <?php get_header(); ?>
    
    <!-- wrapここから -->
    <div id="wrap">
    
    <?php get_sidebar(); ?>
    
    <!-- mainここから -->
    <div id="main">
    
    	<h3 class="archive-title">
    		<?php
    		if (is_category()) {
    		    single_cat_title();
    		} elseif (is_tag()) {
    		    single_tag_title();
    		} elseif (is_tax()) {
    		    single_term_title();
    		} elseif (is_day()) {
    		    echo "日別アーカイブ:" . get_the_time('Y年m月d日');
    		} elseif (is_month()) {
    		    echo "月別アーカイブ:" . get_the_time('Y年m月');
    		} elseif (is_year()) {
    		    echo "年別アーカイブ:" . get_the_time('Y年');
    		} elseif (is_author()) {
    		    echo "投稿者アーカイブ:" . esc_html(get_queried_object()->display_name);
    		} else {
    		    echo "グルメレポート一覧";
    		}
    		?>
    	</h3>
    
    		<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
    		<div class="entry hentry">
    		<div class="entry-box">
    		<span class="entry-date">
    		<time class="published" datetime="<?php the_time('c'); ?>"><?php the_time(get_option('date_format')); ?></time>
    		</span> 
    		<span class="entry-category"><?php echo get_the_term_list($post->ID,'gourmet_cat'); ?><?php the_tags('', ', '); ?></span>
    		<span class="entry-title"><a href="<?php the_permalink(); ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></a>
    		</div>
    		<p class="entry-excerpt"><?php echo mb_substr(get_the_excerpt(), 0, 65); ?>...</p> // 抜粋の文字数
    		<p class="entry-more"><a href="<?php the_permalink() ?>">続きを見る</a></p>
    		</div>
    		<?php endwhile; else : ?>
    		<p>記事がありません</p>
    		<?php endif; ?>
    		<?php
    		if (have_posts() && function_exists("pagination")) {
    		    // 一覧ページネーション
    		    pagination($wp_query->max_num_pages);
    		}
    		?>
    
    </div>
    <!-- mainここまで -->
    
    </div>
    <!-- wrapここまで -->
    
    <?php get_footer(); ?>
    
    こうして作ったファイル群をサーバにUPし、ブラウザのアドレスバーに http://hogehoge.com(お使いのドメイン名)/gourumet/ と入力すればグルメレポート一覧ページが表示されます。http://hogehoge.com(お使いのドメイン名)/gourumet/cat/カテゴリ名/ ならカテゴリ別一覧ページです。

    あとは同じようにブログ「映画リスト」の個別記事ページやアーカイブページを作成するだけです。

    これだけじゃ終われませんよね。

    カスタム投稿タイプで増やしたブログ専用のサイドバーも作りたい。
    同じく新着情報もTOPページや固定ページに表示させたい。

    やりましょう。今度。

    

    Leave a Reply

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    サイト内検索
    • Author

    • Twitter

      Follow @jay0926 (533 followers)
    • Facebook