カスタム投稿を「option」で追加する – 多次元配列版

ワードプレス

カスタム投稿をテキストエリアで追加する際、連想配列だと応用が利かないな、と気が付いて多次元配列で書き直してみました。

手順1 – カスタム投稿定義用テキストエリアを用意

記入例

news,ニュース,text
q_and_a,Q and A,text
event,イベント,grid
document,資料,thumbnail
job_information,求人情報,grid
memo,メモ書き,text
  • オプション名「option_custom_post_types」
  • 一行に「投稿タイプ名(スラッグ),ラベル,表示スタイル」をカンマ区切り
  • 投稿タイプごとに改行

手順2 – 関数ファイルに読みこんで宣言

if ( !function_exists( 'add_post_types' ) ){
	function add_post_types(){
		global $custom_post_types;
		if( get_option( 'option_custom_post_types' ) ){
			$custom_post_text = get_option( 'option_custom_post_types' );
		}else{
			$custom_post_text = '';
		}
		$custom_post_text_row = str_replace( array( "\r\n", "\r", "\n" ), "\n", $custom_post_text );
		$custom_post_data_rows = explode( "\n", $custom_post_text_row );
		if( $custom_post_text ){
			foreach( $custom_post_data_rows as $custom_post_data_row ){
				$custom_post_types[] = explode( ",", $custom_post_data_row );
			}
		}
	}
	add_action( 'after_setup_theme', 'add_post_types' );
}

オプション「option_custom_post_types」を読み込み、

改行で分解して配列に代入⇒さらにカンマで分解して多次元配列に代入しています。

活用パターン:タクソノミーを登録

global $custom_post_types;
if( get_option( 'option_custom_post_types' ) ){
	$custom_post_text = get_option( 'option_custom_post_types' );
}else{
	$custom_post_text = '';
}
if( $custom_post_text ){
	foreach( $custom_post_types as $custom_post_type ){
		$post_type_name = $custom_post_type[0];
		if( empty( $custom_post_type[1] ) ){
			$post_type_label = $custom_post_type[0];
		}else{
			$post_type_label = $custom_post_type[1];
		}
		$tax1_name = $post_type_name . '_tax1';
		$tax1_label = $post_type_label . '分類1';
		$tax2_name = $post_type_name . '_tax2';
		$tax2_label = $post_type_label . '分類2';
		register_post_type( $post_type_name, array(
			'labels' => array(
				'name' => __( $post_type_label ),
				'singular_name' => __( $post_type_label )
			),
			'description' => '',
			'public' => true,
			'has_archive' => true,
			'show_in_rest' => true,
			'hierarchical' => true,
			'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'custom-fields' ,'comments', 'page-attributes' )
		));
		register_taxonomy(
			$tax1_name,
			$post_type_name,
			array(
				'show_in_rest' => true,
				'hierarchical' => true,
				'update_count_callback' => '_update_post_term_count',
				'label' => $tax1_label,
				'singular_label' => $tax1_label,
				'public' => true,
				'show_ui' => true,
				'show_admin_column' => true
			)
		);
		register_taxonomy(
			$tax2_name,
			$post_type_name,
			array(
				'show_in_rest' => true,
				'hierarchical' => true,
				'update_count_callback' => '_update_post_term_count',
				'label' => $tax2_label,
				'singular_label' => $tax2_label,
				'public' => true,
				'show_ui' => true,
				'show_admin_column' => true
			)
		);
	}
};

投稿タイプすべてに決め打ちで「分類1」「分類2」を追加します。

投稿タイプごとにタクソノミーを変えたい場合は条件分岐しまくりで変更することになると思います。

活用パターン:index.php等で一部を取り出す

global $custom_post_types;
if( get_option( 'option_custom_post_types' ) ){
	$custom_post_text = get_option( 'option_custom_post_types' );
}else{
	$custom_post_text = '';
}
foreach( $custom_post_types as $custom_post_type ){
	if( !empty( $custom_post_type[0] ) && !empty( $custom_post_type[2] ) ){
		if( get_post_type() === $custom_post_type[0] ){
			$displaystyle = $custom_post_type[2];
		}
	}
}

投稿タイプ毎に「表示スタイル」を取り出しています。

連想配列と多次元配列

どっちを使うか、私のように場当たりで書いているとなかなか判断が付かないのですが、

  • 連想配列は1対1対応で済む場合にしか使えない
  • 多次元配列はいくつでも拡張できる
  • foreachですべて取り出すなら、多次元配列でだいたい済む

こんな印象です。

 

多次元配列なら「投稿タイプ名(スラッグ),ラベル,表示スタイル、タクソノミー1のスラッグ、タクソノミー1のラベル、タクソノミー2のスラッグ、タクソノミー2のラベル」

のようにいくらでも値を追加できるので、今ケースは多次元配列でいいかな。