여러분이 사용하고 계신 브라우저는 HTML5를 지원하지 않기 때문에 몇몇 요소가 제대로 보이도록 JScript를 사용하고 있습니다. 하지만 여러분의 브라우저 설정에서 스크립트 기능이 꺼져있으므로, 현재 페이지를 제대로 확인하시려면 스크립트 기능을 켜주셔야 합니다. 워드프레스 코멘트 수정 / 삭제 버튼 추가
워드프레스 코멘트 수정 / 삭제 버튼 추가
2년전 작성
2년전 수정

워드프레스 코멘트에는 기본적으로 수정 / 삭제 버튼이 없다.

어떻게 수정 / 삭제 버튼을 추가하는지 공부해보자.

웹서핑 하다가 코멘트에 수정 / 삭제 하는 방법이 나와있는곳을 찾았다.

이 코드는 쿠키를 사용하여 작성자 인증을 하고 수정 / 삭제 버튼이 보이게끔 설정하는 코드다.

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;
:
이전 페이지로 리다이렉트.
참고

Mingg`s Diary
밍구
공부 목적 블로그