※社内専用

カスタム投稿タイプの追加とショートコード利用

  • HOME
  • EPRESS-BS
  • カスタム投稿タイプの追加とショートコード利用

カスタム投稿タイプとは

投稿の枠やそれと同等のレベルの内容を
自由に追加、変更出来る仕様。

投稿自体も投稿タイプの一種とみなすことが出来る。
その場合の用語の当て嵌めは以下のようになっている。 例:投稿にnewsというカテゴリがある
投稿・・・投稿タイプ名
post・・・投稿タイプスラッグ
カテゴリ・・・タクソノミー名
category・・・タクソノミースラッグ
news・・・ターム名
※ここでは便宜的にアルファベットによる識別はスラッグと呼ぶことにする。 これを参考に、以下のような投稿タイプを追加してみる。
メニュー・・・投稿タイプ名
menus・・・投稿タイプスラッグ
カテゴリー・・・タクソノミー名
menus_category・・・タクソノミースラッグ

投稿タイプの追加

// 投稿タイプ追加
class Add_Cutom_Post_Type {
  public function __construct() {
    add_action( 'init', array( $this, 'post' ) );
  }
  public function post(){
    $post_name = 'メニュー';
    $post_slug = 'menu';
    $taxonomy_name = 'カテゴリー';
    $taxonomy_slug = 'menu_category';
    $post_labels = array(
      'name'                => "{$post_name}",
      'singular_name'       => "{$post_name}",
      'add_new_item'        => "新しい{$post_name}を追加",
      'add_new'             => "新規追加",
      'new_item'            => "新しい{$post_name}",
      'view_item'           => "{$post_name}を表示",
      'not_found'           => "{$post_name}はありません",
      'not_found_in_trash'  => "ゴミ箱に{$post_name}はありません。",
      'search_items'        => "{$post_name}を検索",
    );
    $post_args = array(
      'labels'              => $post_labels,
      'public'              => true,
      'show_ui'             => true,
      'query_var'           => true,
      'hierarchical'        => false,
      'menu_position'       => 6,
      'has_archive'         => false,
    );
    $taxonomy_args = array(
      'label' => __( $taxonomy_name ),
      'hierarchical' => true
    );
    register_post_type($post_slug, $post_args);
    register_taxonomy($taxonomy_slug, $post_slug, $taxonomy_args);
    flush_rewrite_rules( false );
  }
}
new Add_Cutom_Post_Type();
タームの仕様はregister_taxonomy関数にてタクソノミーを追加すると自動的に有効になる(当然だが)。
hierarchicalの値をtrueにするとカテゴリー形式、falseにするとタグ形式になる。

ショートコードでの利用

  // [menu slug="【ターム名】"]で利用可能なショートコード。
  add_shortcode( 'menu', function($atts) {
    extract(shortcode_atts( array(
        'slug' => null,
        'per' => '10'
    ), $atts ));

    $paged = get_query_var('paged');
    $args = array(
      'posts_per_page' => $per,
      'paged' => $paged,
      'post_type' => 'menu',
      'order' => 'ASC',
      'tax_query' => array(
        array(
          'taxonomy' => 'menu_category',
          'field'    => 'slug',
          'terms'    => $slug,
        ),
      ),
    );
    $the_query = new WP_Query( $args );

    if($the_query->have_posts()) {
      // ニュースなどと同じくHTMLを文字列として作成し、最後にreturnする。
      return $html;
    }
  } );

とりあえず

オプションが豊富で奥が深い。