| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
- reactive
- 서버운영
- 웹 커리큘럼
- Spring Framework
- spring reactive
- reactor
- Spring Batch
- 웹 스터디
- ipTIME
- 웹앱
- 공유기 서버
- reactor core
- Today
- Total
Hello World
[펌]워드프레스 한국형 게시판 – 2. KBOARD의 폐허 본문

지난글에 이어 포스팅 한드아..
일단은 워드프레스에서 기본적으로 제공하는 사용자 Role(구독자/글쓴이/기여자/편집자/관리자)만으로는 요구사항을 충족시키지 못한다. 우리는 교수님, 수강생, 연구원등의 Role이 필요했기 때문에 일단은 닥치고 User Role Editor 플러그인을 설치했다. 사실 User Role Editor를 설치하기 이전에 Ultimate Member라는 플러그인이 더 쌈박해 보여서 설치를 해보았으나, 사용자 Role을 생성하는 경우 순정(?) 워드프레스 Role과 같은 레벨로 취급되는 것이 아니라 플러그인 내부에서만 사용하는 Role을 생성하길래 과감히 삭제해버렸다. 최초 작업 목표 중에 하나가 최대한 확장 및 재사용 가능도록 Kboard의 소스를 건드리지 않는 것이었기 때문에 WP의 순정(ㅠㅠ) Role 기능을 활용하여 코드를 작성할 필요가 있었던 것이다.
그러나……………………………………………………
작업을 시작한지 몇 시간 되지 않아 Kboard는 폐허로 변해갔다. 아래는 내가 작성한 코드들인데, 사실 무슨 파일 몇 번째 라인에 넣고 어쩌고 설명하고 싶었지만 너무너무 귀찮다. 그냥 맥락을 파악할 수 있는 정도로만 작성해둘 터이니 궁금하신 분은 개인적으로 문의하시라.
일단은 Kboard의 Functions.helper.php파일에 WP Role을 가져오는 함수를 작성하였다. 참고로 필자는 WP 플러그인 개발 경험이 소박하여 User Role Editor를 뒤져 소스를 카피했다. ㅋㅋ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /** * 사용자 롤을 리턴한다. * @return string */function get_user_roles() { global $wp_roles; if (!isset($wp_roles)) { $wp_roles = new WP_Roles(); } $roles = $wp_roles->roles; if (is_array($roles) && count($roles) > 0) { asort($roles); } return $roles;} |
그리고 게시판 설정을 보여주는 kboard_setting.php 파일을 열어 레이아웃을 일부 변경한 후 요런 코드를 추가했다.
1 2 3 4 5 6 7 8 9 10 | // $meta는 kboard에서 사용하는 메타정보 저장 클래스이다. 우리도 저 메타정보 테이블에 설정을 구겨넣을 것이다. // 메타정보 테이블에 설정 정보를 넣을때 json으로 인코딩해서 넣기 때문에 일단 디코딩 하는거임 ㅇㅇ $permission_array = json_decode($meta->permission_read_selected); // $role은 index.php에서 kboard_setting함수가 호출될 때 값을 세팅해 두었다. 잘 들어가있으니 걍 사용하면 된다. foreach($roles as $key=>$val) { echo "<input name='permission_read_selected[".$key."]' id='r_".$key."' type='checkbox' "; if(array_key_exists ($key, $permission_array)) echo "checked"; echo "/><label for='r_".$key."'>".translate_user_role($val['name'])."</label> "; } |
위의 코드는 읽기 권한에 관한 것인데 실제 코드에는 저것과 똑같이 생긴 쓰기 권한 코드도 물론 삽입해 줬다.
마지막으로 index.php에서는 이렇게 하였다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | /* * 게시판 목록 페이지 */function kboard_setting(){ $board = new KBoard(); $board->setID($_GET['board_id']); $meta = new KBoardMeta($board->uid); $skin = KBoardSkin::getInstance(); $roles = get_user_roles(); // 여기서 $role을 세팅해 준다구! if(defined('KBOARD_COMMNETS_VERSION')){ include_once WP_CONTENT_DIR.'/plugins/kboard-comments/class/KBCommentSkin.class.php'; $comment_skin = KBCommentSkin::getInstance(); } include_once 'pages/kboard_setting.php';}/* * 게시판 정보 수정 */function kboard_update(){ global $wpdb; if(!defined('KBOARD_COMMNETS_VERSION')){ die('<script>alert("게시판 생성 실패!\nKBoard 댓글 플러그인을 설치해주세요.\nhttp://www.cosmosfarm.com/ 에서 다운로드 가능합니다.");history.go(-1);</script>'); } $board_id = $_POST['board_id']; $board_name = addslashes($_POST['board_name']); $skin = $_POST['skin']; $page_rpp = $_POST['page_rpp']; $use_comment = $_POST['use_comment']; $use_editor = $_POST['use_editor']; $permission_read = $_POST['permission_read']; $permission_write = $_POST['permission_write']; $admin_user = implode(',', array_map('addslashes', array_map('trim', explode(',', $_POST['admin_user'])))); $use_category = $_POST['use_category']; $category1_list = implode(',', array_map('addslashes', array_map('trim', explode(',', $_POST['category1_list'])))); $category2_list = implode(',', array_map('addslashes', array_map('trim', explode(',', $_POST['category2_list'])))); $create = date("YmdHis", current_time('timestamp')); if(!$board_id){ $wpdb->query("INSERT INTO `".KBOARD_DB_PREFIX."kboard_board_setting` (`board_name`, `skin`, `page_rpp`, `use_comment`, `use_editor`, `permission_read`, `permission_write`, `admin_user`, `use_category`, `category1_list`, `category2_list`, `created`) VALUE ('$board_name', '$skin', '$page_rpp', '$use_comment', '$use_editor', '$permission_read', '$permission_write', '$admin_user', '$use_category', '$category1_list', '$category2_list', '$create')"); $board_id = $wpdb->insert_id; } else{ $wpdb->query("UPDATE `".KBOARD_DB_PREFIX."kboard_board_setting` SET `board_name`='$board_name', `skin`='$skin', `page_rpp`='$page_rpp', `use_comment`='$use_comment', `use_editor`='$use_editor', `permission_read`='$permission_read', `permission_write`='$permission_write', `use_category`='$use_category', `category1_list`='$category1_list', `category2_list`='$category2_list', `admin_user`='$admin_user' WHERE `uid`='$board_id'"); } if($board_id){ $meta = new KBoardMeta($board_id); $meta->use_direct_url = $_POST['use_direct_url']; $meta->latest_alerts = implode(',', array_map('addslashes', array_map('trim', explode(',', $_POST['latest_alerts'])))); $meta->comment_skin = $use_comment?$_POST['comment_skin']:''; $meta->default_content = $_POST['default_content']; $meta->pass_autop = $_POST['pass_autop']; $meta->shortcode_execute = $_POST['shortcode_execute']; $meta->autolink = $_POST['autolink']; $meta->reply_copy_content = $_POST['reply_copy_content']; $meta->view_iframe = $_POST['view_iframe']; $meta->permission_comment_write = $_POST['permission_comment_write']; // 여기서 우리 데이터를 DB로 입력해 둘거야!! $meta->permission_read_selected = json_encode($_POST['permission_read_selected']); $meta->permission_write_selected = json_encode($_POST['permission_write_selected']); $auto_page = $_POST['auto_page']; if($auto_page){ $auto_page_board_id = $wpdb->get_var("SELECT `board_id` FROM `".KBOARD_DB_PREFIX."kboard_board_meta` WHERE `key`='auto_page' AND `value`='$auto_page'"); if($auto_page_board_id && $auto_page_board_id != $board_id) echo '<script>alert("선택하신 페이지에 이미 연결된 게시판이 존재합니다.")</script>'; else $meta->auto_page = $auto_page; } else{ $meta->auto_page = ''; } } if($_POST['board_id']){ die('<script>history.go(-1);</script>'); } else{ die('<script>location.href="' . KBOARD_SETTING_PAGE . '&board_id=' . $board_id . '"</script>'); }} |
내가 추가한 부분은 코멘트를 달아놓은 두 곳 뿐이다.
어찌되었든 여기까지 해서 이제 설정 화면에서 Role을 선택하여 저장할 수 있고 저장된 Role을 눈으로 확인 할 수 있게 되었다. 아싸. 물논! 앞에있는 드롭다운 메뉴에서 ‘선택된 그룹’을 선택했을 때만 보이도록 조금 수정을 더 해줘야겠다.
이제 실제로 게시판을 읽고 쓰는 부분에서 우리가 저장해 둔 메타정보를 가져와서 현재 사용자의 Role과 비교해 주면 끄읕~
일단 커피를 한 잔하고 계속 해보자규. 아놔 근데 code 숏코드 사이에 있는 녀석들 자동 줄맞춤 하는 방법 없나?
자.. 커피를 마셨으니 이제 마저 써본다.
읽기/쓰기권한은 위에서 DB에 저장을 잘 해 주었다. 이제 읽고 쓸때 실제로 권한을 체크해주는 부분만 만들어주면 된다는 말씀. 그래서 KBoard.class.php에서 읽기 권한을 체크해주는 isReader함수와 쓰기권한을 체크해주는 isWriter함수를 수정해주었다. $this->permission_write == ‘particular’ 체크하는 else if문만 추가해 준거다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | /*** 글 쓰기 권한이 있는 사용자인지 확인한다.* @return boolean*/public function isWriter(){$admin_user = array_map(create_function('$string', 'return trim($string);'), explode(',', $this->admin_user));if($this->permission_write == 'all'){return true;}else if($this->userdata->data->ID){if(@in_array('administrator', $this->userdata->roles) || @in_array('editor', $this->userdata->roles)){// 최고관리자 허용return true;}else if($this->permission_write == 'editor' && @in_array($this->userdata->data->user_login, $admin_user)){// 선택된 관리자 권한일때, 사용자명과 선택된관리자와 비교후, 일치하면 허용return true;}else if($this->permission_write == 'author'){// 로그인 사용자 권한일때, role대신 ID값이 있으면, 모든 사용자 허용return true;}else if($this->permission_write == 'particular' && !$secret){// 특정 그룹 권한일때, 메타 데이터에 사용자 롤이 있으면 허용$meta = new KBoardMeta($this->id);$permission_array = json_decode($meta->permission_write_selected);foreach($this->userdata->roles as $user_role) {if(array_key_exists($user_role, $permission_array)) {return true;}}return false;}}else{return false;}} |
오 굳.. 잘 동작한다. 굳굳.. Kboard에서 정식으로 업데이트 해주면 정말 좋겠다.
이제 스마트에디터 이식 작업에 돌입한다. 귀찮다. 하지만 돈 벌려면 해야한다.
흙………………….
출처: http://funexlab.com/%EC%9B%8C%EB%93%9C%ED%94%84%EB%A0%88%EC%8A%A4-%ED%95%9C%EA%B5%AD%ED%98%95-%EA%B2%8C%EC%8B%9C%ED%8C%90-2-kboard%EC%9D%98-%ED%8F%90%ED%97%88/
'Wordpress' 카테고리의 다른 글
| [펌]워드프레스 플러그인 만들기 (0) | 2016.01.20 |
|---|---|
| 워드프레스 유저 권한과 역할을 체크하기. (0) | 2016.01.13 |
| [펌]워드프레스 한국형 게시판 – 3. 다섯 스킨 전투 (0) | 2016.01.11 |
| [펌]워드프레스 한국형 게시판 – 1. 뜻밖의 삽질 (0) | 2016.01.11 |
