[010] カスタム投稿とカスタムフィールドを組み合わせる

カスタム投稿タイプとカスタムフィールドを組み合わせて、新しいカスタム投稿タイプ「新-東京風景」を作成した。その際におこなったことは以下の4つでした。

(1) カスタム投稿タイプの定義
編集フォームのメタボックスを呼び出すコールバック関数を「register_meta_box_cb」で設定

(2) 上記定義をアクションフックで init に定義
(参考)http://wpdocs.sourceforge.jp/関数リファレンス/register_post_type

伊賀上野(3) コールバック関数で編集フォームの設定
add_meta_box 関数を定義

(4) カスタムフィールドの値を保存
データが入力された際 save_post アクションフックを使って保存する
(出典)http://wpdocs.sourceforge.jp/関数リファレンス/add_meta_box

このコードを functions.php で include した。


ひとつめはカスタム投稿タイプの定義

add_action('init','register_tokyo_scene'); 
function register_tokyo_scene(){
         register_post_type(
		'tokyo_scene',
		array(
			'label' => __('新-東京風景'),	
			'singular_label' => __('新-東京風景'),
			'public'	=> true,	
			'show_ui'	=> true,	
			'capability_type' => 'post',	
			'hierarchical'	=> true,	
			'rewrite'	=> false, 	
			'query_var'	=> false, 	
			'show_in_nav_menus' => true,	
			'supports'	=> array('title','editor','thumbnail'),
			'register_meta_box_cb' => 'add_meta_box_tokyo_scene'
		)
	);
}



次に、カスタムフィールドの値を保存する
add_action('save_post', 'save_custom_tokyo_scene');
function save_custom_tokyo_scene($post_id){

	// 自動保存ルーチンかどうかチェック。そうだった場合はフォームを送信しない(何もしない)
	if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) 
		return $post_id;

	// パーミッションチェック
	if ( 'tokyo_scene' == $_POST ) {
		if ( !current_user_can( 'edit_post', $post_id ) )
			return $post_id;
	} else {
			return $post_id;
	}

	// 承認ができたのでデータを探して保存
	$longitude  = $_POST;
	$latitude   = $_POST;
	$scene_type = $_POST;
	$photo_url  = $_POST;
	$access_disc= $_POST;
	if($longitude == '') {	delete_post_meta($post_id, 'longitude'); }
	               else  {	update_post_meta($post_id, 'longitude', $longitude);	}
	if($latitude  == '') {	delete_post_meta($post_id, 'latitude' ); }
	               else  {	update_post_meta($post_id, 'latitude', $latitude );	}
	if($scene_type== '') {	delete_post_meta($post_id, 'scene_type'); }
	               else  {	update_post_meta($post_id, 'scene_type', $scene_type);	}
	if($photo_url == '') {	delete_post_meta($post_id, 'photo_url'); }
	               else  {	update_post_meta($post_id, 'photo_url', $photo_url);	}
	if($access_disc=='') {	delete_post_meta($post_id, 'access_disc'); }
	               else  {	update_post_meta($post_id, 'access_disc', $access_disc);}
}



さらにカスタム投稿タイプの register_meta_box_cb で定義したコールバック関数を追加する。
function add_meta_box_tokyo_scene($post){
	add_meta_box('meta_box_tokyo_scene','東京風景-属性','add_field_tokyo_scene','tokyo_scene', 'normal', 'high');
}
function add_field_tokyo_scene($post, $box){
	$longitude = get_post_meta($post->ID, 'longitude' , true);
	$latitude = get_post_meta($post->ID, 'latitude'   , true);
	$scene_type = get_post_meta($post->ID, 'scene_type' , true);
	$photo_url = get_post_meta($post->ID, 'photo_url'  , true);
	$access_disc = get_post_meta($post->ID, 'access_disc', true);

	echo wp_nonce_field('my_area_meta', 'my_area_meta_nonce');
	echo '';
	echo '.line{display:block;} .line:after{display:block;content:"";height:0;clear:both;}';
	echo '.right{display:block;float:right;} .left{display:block;float:left;} .meta_name{margin-right:10px;}';
	echo '';
	echo '<ul>';
	echo '<li class="line"><div class="left meta_name">URL:</div><div class="left meta_name"></div></li>';
	echo '<li class="line"><img width="200px" src="'.$photo_url.'"></li>';
	echo '<li class="line"><div class="left meta_name">区分</div>';
	echo '<div class="left meta_name">風景</div>';
	echo '<div class="left meta_name">建物</div>';
	echo '<div class="left meta_name">静物</div>';
	echo '<div class="left meta_name">人物</div></li>';
	echo '<hr>アクセス<br /><br />';
	echo '<li class="line"><div class="left meta_name">';
	echo '<div class="left meta_name">緯度</div><div class="left meta_name"></div>';
	echo '<div class="left meta_name">経度</div><div class="left meta_name"></div></div></li>';
	echo '<li class="line"><div class="left meta_name">説明</div><textarea rows="5" cols="60" name="access_disc">'.$access_disc.'</textarea></li>';
	echo '</ul>';
}



“[010] カスタム投稿とカスタムフィールドを組み合わせる” への4件のコメント

  1. kara_d より:

    [010] カスタム投稿とカスタムフィールドを組み合わせる http://t.co/VmWdXz4H

  2. infoeproduction より:

    こうすればwordpressでもコンテンツタイプを作れそう -> [010] カスタム投稿とカスタムフィールドを組み合わせる | WordPress experiment – twentyten customize- http://t.co/LpVNZNCw

  3. zenich より:

    こうすればwordpressでもコンテンツタイプを作れそう -> [010] カスタム投稿とカスタムフィールドを組み合わせる | WordPress experiment – twentyten customize- http://t.co/LpVNZNCw

  4. ryuzee より:

    やりたかったことそのものずばり / [010] カスタム投稿とカスタムフィールドを組み合わせる | WordPress experiment – twentyten customize- http://htn.to/iSTnpq

コメントをどうぞ