カスタム投稿を複数作るときにできるだけ分かりやすく複製する

カスタム投稿を複数作るときにできるだけ分かりやすく複製する

wordpressのカスタム投稿を作るコードって色んなところで公開されてますし、今更書くことでもないかなとは思っていたんですが、同じような設定のカスタム投稿を複数作るときって記述が長くなりがちで、分かりにくくなります。
当サイトを作るときも同じようなことを思いました。
似たような記述だし、どうにか分かりやすく簡単に書けないものかと思って、今回の記事を書くことにしました。
記事内のカスタム投稿の設定はかなり簡易的なものなので、本当はもう少し複雑だと思います。

よくあるカスタム投稿の制作コード

// カスタム投稿「WEB制作」(post_type:web)
function create_post_web(){
  // カスタム投稿の設定
  $post_args = array(
    'labels' => [
      'name'          => 'WEB制作',
      'singular_name' => 'web',
    ],
    'public'        => true,
    'has_archive'   => true,
    'menu_position' => 5,
    'rewrite'       => array('slug' => 'web', 'with_front' => false),
    'supports'      => array( 'title','editor','thumbnail','excerpt')
  );
  // カスタム投稿の登録
  register_post_type('web',$post_args);
  
  // カスタムタクソノミー(カテゴリー)の設定
  $category_args = array(
    'hierarchical' => true,
    'label' => 'WEB制作のカテゴリー', 
    'public' => true,
    'show_ui' => true
  );
  // カスタムタクソノミー(カテゴリー)の登録
  register_taxonomy('web_category','web',$category_args);
  
  // カスタムタクソノミー(タグ)の設定
  $tag_args = array(
    'hierarchical' => false,
    'label' => 'WEB制作のタグ', 
    'public' => true,
    'show_ui' => true
  );
  // カスタムタクソノミー(タグ)の登録
  register_taxonomy('web_tag','web',$tag_args);

}
add_action('init', 'create_post_web');

今回作ったカスタム投稿の制作コード

コードをクリップボードにコピー
function returnPostArgs($array){
  $post_type = $array['post_type'];
  $name = $array['name'];
  $args = array(
    'labels' => [
      'name'          => $name,
      'singular_name' => $post_type,
    ],
    'public'        => true,
    'has_archive'   => true,
    'menu_position' => 5,
    'rewrite'       => array('slug' =>$post_type, 'with_front' => false),
    'supports'      => array( 'title','editor','thumbnail','excerpt')
  );
  return $args;
}

function returnCatArgs($array){
  $name = $array['name'];
  $args = array(
    'hierarchical' => true,
    'label' => $name.'のカテゴリー', 
    'public' => true,
    'show_ui' => true
  );
  return $args;
}

function returnTagArgs($array){
  $name = $array['name'];
  $args = array(
    'hierarchical' => false,
    'label' => $name.'のタグ', 
    'public' => true,
    'show_ui' => true
  );
  return $args;
}

// カスタム投稿「WEB制作」(post_type:web)
$post_web_array = array(
  'post_type' => 'web',
  'name'      => 'WEB制作'
);
function create_post_web($array){
  $post_args = returnPostArgs($array);
  $category_args = returnCatArgs($array);
  $tag_args = returnTagArgs($array);
  // カスタム投稿の設定
  register_post_type($array['post_type'],$post_args);
  // カスタムタクソノミー(カテゴリー)の登録
  register_taxonomy($array['post_type'].'_category',$array['post_type'],$category_args);
  // カスタムタクソノミー(タグ)の設定
  register_taxonomy($array['post_type'].'_tag', $array['post_type'] , $tag_args);
}
add_action('hook_create_post_web', 'create_post_web',10,1);
do_action('hook_create_post_web',$post_web_array);

一見すると、長くなってるじゃんって思いますが、今回作った制作コードは同じような設定のカスタム投稿を複製するときは、41〜57行目をコピペして数カ所書き換えればいいんです。
同じ設定でpost_type:fx、name:FXのカスタム投稿を作るときは、以下のようになります。

function returnPostArgs($array){
  $post_type = $array['post_type'];
  $name = $array['name'];
  $args = array(
    'labels' => [
      'name'          => $name,
      'singular_name' => $post_type,
    ],
    'public'        => true,
    'has_archive'   => true,
    'menu_position' => 5,
    'rewrite'       => array('slug' =>$post_type, 'with_front' => false),
    'supports'      => array( 'title','editor','thumbnail','excerpt')
  );
  return $args;
}

function returnCatArgs($array){
  $name = $array['name'];
  $args = array(
    'hierarchical' => true,
    'label' => $name.'のカテゴリー', 
    'public' => true,
    'show_ui' => true
  );
  return $args;
}

function returnTagArgs($array){
  $name = $array['name'];
  $args = array(
    'hierarchical' => false,
    'label' => $name.'のタグ', 
    'public' => true,
    'show_ui' => true
  );
  return $args;
}

// カスタム投稿「WEB制作」(post_type:web)
$post_web_array = array(
  'post_type' => 'web',
  'name'      => 'WEB制作'
);
function create_post_web($array){
  $post_args = returnPostArgs($array);
  $category_args = returnCatArgs($array);
  $tag_args = returnTagArgs($array);
  // カスタム投稿の設定
  register_post_type($array['post_type'],$post_args);
  // カスタムタクソノミー(カテゴリー)の登録
  register_taxonomy($array['post_type'].'_category',$array['post_type'],$category_args);
  // カスタムタクソノミー(タグ)の設定
  register_taxonomy($array['post_type'].'_tag', $array['post_type'] , $tag_args);
}
add_action('hook_create_post_web', 'create_post_web',10,1);
do_action('hook_create_post_web',$post_web_array);

// カスタム投稿「FX」(post_type:fx)
$post_fx_array = array(
  'post_type' => 'fx',
  'name'      => 'FX'
);
function create_post_fx($array){
  $post_args = returnPostArgs($array);
  $category_args = returnCatArgs($array);
  $tag_args = returnTagArgs($array);
  // カスタム投稿の設定
  register_post_type($array['post_type'],$post_args);
  // カスタムタクソノミー(カテゴリー)の登録
  register_taxonomy($array['post_type'].'_category',$array['post_type'],$category_args);
  // カスタムタクソノミー(タグ)の設定
  register_taxonomy($array['post_type'].'_tag', $array['post_type'] , $tag_args);
}
add_action('hook_create_post_fx', 'create_post_fx',10,1);
do_action('hook_create_post_fx',$post_fx_array);

通常であれば記述箇所すべてをコピペしなくてはいけないところを、だいぶ少ない箇所のコピペのみで完了しています。
コピペしたときはどこを書き換えたのかは、次で説明します。

複製するときは

コードを見ながらではないと、理解が難しいと思うので、ここから先を読む人は以下のコードのポップアップを押してから読んでください。

コードをポップアップで表示

カスタム投稿「FX」はカスタム投稿「WEB制作」の41〜57行目をコピペして作っています。
書き換えている箇所は以下の通りです。

変更前 変更後
41行目
$post_web_array
$post_fx_array
42行目
'post_type' => 'web',
'post_type' => 'fx',
43行目
'name' => 'WEB制作',
'name' => 'FX',
56行目
add_action('hook_create_post_web', 'create_post_web',10,1);
add_action('hook_create_post_fx', 'create_post_fx',10,1);
57行目
do_action('hook_create_post_web',$post_web_array);
do_action('hook_create_post_fx',$post_fx_array);

以上、5箇所を書き換えれば、同じ設定のカスタム投稿が複製できます。
これを使えば書き間違えのミスも防ぐこともできます。

今回制作したコードの40行目までの記述はそれぞれ、カスタム投稿、カスタムタクソノミー(カテゴリー)、カスタムタクソノミー(タグ)の設定を返す関数になっています。
カスタム投稿の設定が、returnPostArgs関数
カスタムタクソノミー(カテゴリー)の設定が、returnCatArgs関数
カスタムタクソノミー(タグ)の設定が、returnTagArgs関数
になります。
それぞれの設定を変えたい場合は、こちらの中身を書き換えれば大丈夫です。

また今回はpost_typeとslugを一緒の値を使用していますが、
変えたい場合は、設定値の配列($post_web_array や $post_fx_array)の中身を増やして、
設定を返す関数の中身を $slug = $array['slug']; などにして書き換えると大丈夫です。

ほんとはfor文とかforeach文とかで回せばもっと簡略化できるんじゃないかなーとも思いましたが、ここまで簡略化できただけでもいっか、と思いました。

arrow_circle_up