せっかくなのでソースコード共々紹介したいと思います!
地球上に何十億人もいるらしい人類うちの、誰か一人にでも役立てば幸いですww
下記の記事で公開されていたコードを基にして改造を加えました。
なので僕の記事でなく下記の記事を参考にするのも大いにアリです!
(ただ、当ブログのコードの21行目と71行目に相当する部分だけ注意したほうがいい......かも?)
ゴーゴーウェブマーケット技術BLOG | Wordpressで簡易的な出欠確認をする。
設置方法
下記のコードを "wordpress/wp-content/themes/テーマ名" 以下の"function.php"に追記します。
使い方
記事作成時にカテゴリを「出欠確認」にします。
ログインした状態で記事を閲覧すると、出欠確認画面が表示されているハズです。
(ログインしていないと使えません。)
注意事項
僕は責任取りません。無責任です。ご利用は自己責任でお願いします。
環境次第では、レイアウトが崩れそうな気がします。
特に、行折り返しの部分(117行目~133行目と138行目~142行目)は無謀なことをしている気がするのでヤバイです。
↑
いっそのこと、該当部分をまるまる削除するのもアリです。
カスタムフィールドを利用しています。
記事を作成する方は該当するカスタムフィールドを間違って編集しないように気をつけてください。
お願い
問題点の報告や改善案、アドバイスなど大歓迎です。
function.php
/////////以下、function.phpへの追記箇所///////////
//出欠確認
add_filter('the_content', 'join_check');
function join_check($content){
	//選択肢をここで設定
	$key_select = array("参加","保留","不参加");
	$ret="";
	//ログインしてないユーザーには表示しない
	if(is_user_logged_in()){
		global $user_identity,$post;
		//カスタムフィールドからデータを読み込む
		$join_data = unserialize(get_post_meta($post->ID,'join_meta',true));
		$comment_data = unserialize(get_post_meta($post->ID,'comment_meta',true));
		//送信ボタンを押したときの処理(各カスタムフィールドを更新する)
		if($_POST['select_join_'.$post->ID]){
			//出欠登録
			$join_data[$user_identity] = $_POST['select_join_'.$post->ID];
			$join_s = serialize($join_data);
			update_post_meta($post->ID, 'join_meta', $join_s);
			//コメント登録
			$comment_data[$user_identity] = $_POST['comment'];
			$comment_s = serialize($comment_data);
			update_post_meta($post->ID, 'comment_meta', $comment_s);
		}
		//出欠の回答ごとにグループ分けをして
		//出力内容を連想配列に格納。
		foreach($join_data as $key => $value){
			foreach($key_select as $key_group){
				if($value == $key_group){
					$flag = 0;
					foreach($comment_data as $key2 => $value2){
						if($key2 == $key){	//joinとcommentのユーザ名が一致したとき
							if($value2){	//コメントがあればTRUE
								//出力内容(名前とコメント)を格納
								$group[$key_group][] = $key.'<font color="#999999">('.$value2.')</font>';
							}else{
								//出力内容(名前)を格納
								$group[$key_group][] = $key;
							}
							$flag=1;
						}
					}
					if($flag == 0){$group[$key_group][] = $key;};
				}
			}
		}
		///////OUT PUT////////
		//カテゴリが"出欠確認"の場合のみ表示する
		if(in_category('出欠確認')){
			//出欠確認フォーム
			$ret .= '<ul>';
			$ret .= '<br><form method="POST">';
			$ret .= '<input type="hidden" value="join_check" >';
			$ret .= '<select name="select_join_'.$post->ID.'">';
			foreach($key_select as $key_option){
				$ret .= '<option value="' . $key_option . '"';
				if($join_data[$user_identity] == $key_option){
					$ret .= 'selected';
				}
				$ret .='>' . $key_option . '</option>';
			}
			$ret .= '</select>';
			$ret .= ' <small>コメント</small>:<input type="text" name="comment" value="'.$comment_data[$user_identity].'" size="30"/>';
			$ret .= '<input type="submit" value="post">';
			$ret .= '</form>';
			//出欠回答状況
			$ret .='<table><tr><td>';
			//回答ごとにループ
			$grp_no = 0;
			foreach($key_select as $key_title){
				$grp_no++;
				//回答ごとの人数をカウント
				$ninzu_count = 0;
				foreach($group[$key_title] as $group_user){
					$ninzu_count++;
				}
				$ret .= '<div class="join_group join_no_' . $grp_no . ' "style="margin:0px 0px 0px 0px;">';
				$ret .= '<b>'. $key_title . '('.$ninzu_count.')</b><br/>';
				$ret .= '<font size="2">';
				//ユーザごとにループ
				$ret .='<ul>';
				$flag = 0;
				$str_count = 0;
				foreach($group[$key_title] as $group_user){
					if($flag ==1){
						$ret .= ', ';
						$str_count += 3;
					}
					//一行あたりの文字数が多すぎるときの改行処理。
					//文字長45文字以上でコメントありと判定して
					//HTMLタグ分の41文字を文字数から差し引く
					//文字長が$max_strを超えたら改行処理
					$str_len = strlen($group_user);
					$str_count += $str_len;
					if($str_len > 45){
						$str_count -= 41;
						$str_len -= 41;
					}
					$max_str = 93;
					if($str_count > $max_str){
						$ret .='<br/>';
						$str_count = $str_len;
					}
					//名前、コメントを出力
					$ret .= $group_user;
					//一行あたりの文字数が異常に多いときにもう一度改行
					if($str_len > $max_str){
						$ret .='<br/>';
						$str_count = 0;
					}
					$flag = 1;
				}
				$ret .='</ul>';
				$ret .='</font><br/>';
			}
			$ret .= '</td></tr></table></ul>';
		}
	}
	return $content . $ret;
}
ちなみにこんな感じになります。







