워드프레스 코멘트에는 기본적으로 수정 / 삭제 버튼이 없다.
어떻게 수정 / 삭제 버튼을 추가하는지 공부해보자.
웹서핑 하다가 코멘트에 수정 / 삭제 하는 방법이 나와있는곳을 찾았다.
이 코드는 쿠키를 사용하여 작성자 인증을 하고 수정 / 삭제 버튼이 보이게끔 설정하는 코드다.
functions.php 파일에 추가
include 'mycommteditable.php'; $GLOBALS['mycommteditable'] = new MY_Commt_Editable();
사용된 코드 설명
include ‘mycommteditable.php’;
:
mycommteditable.php 파일 추가.
$GLOBALS[‘mycommteditable’] = new MY_Commt_Editable();
:
MY_Commt_Editable 인스턴스 생성.
mycommteditable.php 생성
<?php class MY_Commt_Editable { function __construct() { add_action( 'comment_post', array($this, 'set_cookie') ); add_filter( 'comment_text', array($this, 'add_links'), 10, 2 ); add_filter( 'comment_text', array($this, 'add_editor'), 99, 2 ); add_action( 'admin_post_mycommtedit', array($this, 'edit_request') ); add_action( 'admin_post_nopriv_mycommtedit', array($this, 'edit_request') ); add_action( 'admin_post_mycommtdelete', array($this, 'delete_request') ); add_action( 'admin_post_nopriv_mycommtdelete', array($this, 'delete_request') ); } function add_links($comment_text, $comment) { if( $this->can_edit( $comment->comment_ID ) ){ $edit_url = add_query_arg( array( 'mycommtedit' => $comment->comment_ID, ), get_comment_link($comment->comment_ID) ); $delete_url = add_query_arg( array( 'action' => 'mycommtdelete', 'comment_id' => $comment->comment_ID, 'nonce' => wp_create_nonce('mycommtdelete'), ), admin_url('admin-post.php') ); $links = '<a class="edit btn" href="' . $edit_url . '">수정</a>'; $links .= '<span class="sep"> | </span>'; $links .= '<a class="delete btn" href="' . $delete_url . '">삭제</a>'; $links = ' <span class="mycommteditable-links">' . $links .'</span> '; $comment_text .= $links; } return $comment_text; } function add_editor($comment_text, $comment) { if( isset( $_REQUEST['mycommtedit'] ) && $_REQUEST['mycommtedit'] == $comment->comment_ID && $this->can_edit( $comment->comment_ID ) ){ ob_start(); ?>comment_author_IP), time() + $cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN ); } function delete_cookie($comment_id) { setcookie( 'mycommteditable_' . $comment_id . '_' . COOKIEHASH, ' ', time() - YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN ); } function can_edit($comment_id) { $comment = get_comment($comment_id); if( isset($_COOKIE['mycommteditable_' . $comment_id . '_' . COOKIEHASH]) && $_COOKIE['mycommteditable_' . $comment_id . '_' . COOKIEHASH] == md5($comment->comment_author_IP) ) return true; return false; } function edit_request() { if( ! isset($_REQUEST['nonce']) || ! wp_verify_nonce($_REQUEST['nonce'], 'mycommtedit') || ! isset($_REQUEST['comment_id']) ) return; $comment_id = $_REQUEST['comment_id']; if( $this->can_edit( $comment_id ) ){ $data = array( 'comment_ID' => $comment_id, 'comment_content' => $_REQUEST['comment_content'], ); wp_update_comment( $data ); $goback = get_comment_link($comment_id); wp_redirect( $goback ); exit; }else{ wp_die( '댓글 수정 권한이 없거나 쿠키가 만료되었습니다.' ); } } function delete_request() { if( ! isset($_REQUEST['nonce']) || ! wp_verify_nonce($_REQUEST['nonce'], 'mycommtdelete') || ! isset($_REQUEST['comment_id']) ) return; $comment_id = $_REQUEST['comment_id']; if( $this->can_edit( $comment_id ) ){ wp_delete_comment( $comment_id, false ); $this->delete_cookie($comment_id); $goback = wp_get_referer(); wp_redirect( $goback ); exit; }else{ wp_die( '댓글 삭제 권한이 없거나 쿠키가 만료되었습니다.' ); } } } ?>
사용된 코드 설명
function set_cookie()
:
작성자 인증을 위해 쿠키 생성하는 함수.
add_action( ‘comment_post’, array($this, ‘set_cookie’) );
:
댓글이 저장되자마자 실행되는 ‘comment_post’ 훅 이용하여 액션 걸어주기.
$cookie_lifetime = apply_filters(‘mycommteditable_cookie_lifetime’, 60*1440);
:
기본 유지시간을 1440분(24시간)으로 설정. 1440 대신 15 기재시 15분으로 설정된다.
setcookie( ‘mycommteditable_’ . $comment_id . ‘_’ . COOKIEHASH, md5($comment->comment_author_IP), time() + $cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN );
:
댓글별로 IP를 저장하고 md5로 암호화 한다.
add_filter( ‘comment_text’, array($this, ‘add_links’), 10, 2 );
:
댓글 내용 뒷부분에 링크를 표시하는 ‘comment_text’ 훅 이용하여 액션 걸어주기.
function add_links($comment_text, $comment){ … }
:
작성자 인증 후 댓글 고유주소에 댓글 아이디가 할당된 ‘mycommtedit’ 변수를 붙여 수정 URL 만들기.
function can_edit($comment_id){ … }
:
인증 코드를 재사용하기위해 함수화하기.
add_filter( ‘comment_text’, array($this, ‘add_editor’), 99, 2 );
:
댓글 내용 뒷부분에 코멘트폼을 표시하는 ‘comment_text’ 훅 이용하여 액션 걸어주기.
if( isset( $_REQUEST[‘mycommtedit’] )
:
‘mycommtedit’ 변수요청이 있는지 확인.
&& $_REQUEST[‘mycommtedit’] == $comment->comment_ID
:
‘mycommtedit’ 변수가 현재 댓글 아이디와 같은지 확인.
&& $this->can_edit( $comment->comment_ID )
:
작성자 인증.
ob_start();
:
출력 버퍼 시작.
$comment_text = ob_get_clean();
:
출력 버퍼 리턴.
add_action( ‘admin_post_mycommtedit’, array($this, ‘edit_request’) );
:
수정 요청을 캐치하기 위해 ‘admin_post_mycommtedit’ 훅 이용하여 액션 걸어주기.
add_action( ‘admin_post_nopriv_mycommtedit’, array($this, ‘edit_request’) );
:
수정 요청을 캐치하기 위해 ‘admin_post_nopriv_mycommtedit’ 훅 이용하여 액션 걸어주기.
if( ! isset($_REQUEST[‘nonce’]) … return;
:
요청 변수 검증.
if( $this->can_edit( $comment_id ) ) { … }
:
작성자 인증. 댓글 내용 업데이트.
wp_update_comment( $data ); … exit;
:
댓글 고유주소로 리다이렉트.
delete_url = add_query_arg( … );
:
삭제 URL 구성.
add_action( ‘admin_post_mycommtdelete’, array($this, ‘delete_request’) );
:
삭제 요청을 캐치하기 위해 ‘admin_post_mycommtdelete’ 훅 이용하여 액션 걸어주기.
add_action( ‘admin_post_nopriv_mycommtdelete’, array($this, ‘delete_request’) );
:
삭제 요청을 캐치하기 위해 ‘admin_post_nopriv_mycommtdelete’ 훅 이용하여 액션 걸어주기.
if( ! isset($_REQUEST[‘nonce’]) … return;
:
요청 변수 검증.
if( $this->can_edit( $comment_id ) )
:
작성자 인증.
wp_delete_comment( $comment_id, false );
:
댓글 삭제.
$this->delete_cookie($comment_id);
:
쿠키 삭제.
$goback = wp_get_referer(); … exit;
:
이전 페이지로 리다이렉트.
참고
BiscuitPress - 워드프레스 – 댓글 수정 및 삭제