WordPressで出欠確認(function.php)

  • web, PHP
6月ごろ、某所で運用しているWordPressに出欠管理機能を追加しました。
せっかくなのでソースコード共々紹介したいと思います!

地球上に何十億人もいるらしい人類うちの、誰か一人にでも役立てば幸いです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;
}

ちなみにこんな感じになります。
syukketu.jpg


Track Back

Track Back URL

Comments [3]

wordpress初心者ですが記事大変参考になりました!

質問があるのですが、出欠確認ページで自分以外の参加の可否をわからないようにするのはどうすればいいのでしょうか?
出欠連絡と全体の回答一覧を別ページを分けて、回答一覧を公開にしなければOK(下書きで管理者だけ見れるようにする)かなと思いいろいろいじってみたのですがうまくいきませんでした。

自分でできたのは、出欠連絡ページに自分の回答状況を示す下の内容くらいです。
(69行目に入れました)

//ユーザーごとの回答状況
$ret .= "あなたの現在のステータスは";
if ($join_data[$user_identity] == null)
{$ret .= "未回答です";}
else {$ret .="{$join_data[$user_identity]}です";}
;

後は固定ページで表示するために下記を変更しました。
in_category('出欠確認') → is_page('出欠確認')

初心者の質問で恐縮ですが、またお手すきのときにでも教えていただだければ非常にうれしいです。
よろしくお願いします。

返信ありがとうございます。

buddypressというプラグインを使って会員用サイトで出席確認ページを作ろうとしていたのですが、$user_identityで取得できるのがデータベースでいうdisplay_nameになっていました。(buddypressの特有の問題?)
display_nameは変更可能なため、ユーザーが変更すると$user_identityを再設定しないといけなくなるため、$user_levelを使って権限による条件分岐にしました。

また、display_nameが変更可能なため、ユーザーが名前を変えて投稿するごとにカウントされてしまうことを発見したので、$user_identityを$user_loginに変更しました。

なんとなくですがうまくいった気がしています。
ブログの記事、非常に参考になりました。
ありがとうございました。

コメントする

公開されません

このページの上部へ