일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 서버운영
- 공유기 서버
- reactor core
- reactor
- ipTIME
- 웹 커리큘럼
- reactive
- 웹앱
- 웹 스터디
- Spring Framework
- spring reactive
- Spring Batch
- 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 |