워드프레스 포스트 작성할 때 ‘검토(pending)’, ‘임시(draft)’, ‘공개(publish)’, ‘비공개(private)’ 등의 포스트 상태(post_status
)를 선택하여 저장할 수 있습니다. 워드프레스 포스트 상태에 관한 정보는 다음을 참고할 수 있습니다.
워드프레스의 기본은 포스트 저장 후 편집 화면을 다시 보여줍니다. 회원제 사이트에서 특정 그룹(Role)이나 회원의 권한(Capability)에 포스트 등록 권한(edit_posts
)은 있지만, 공개한 포스트 편집 권한(edit_published
)이 없을 때 포스트를 ‘공개’로 저장하면 포스트 편집 링크가 나오지 않는 포스트 목록 페이지로 이동합니다. ‘임시 글로 저장(draft)’ 저장하면 편집 화면이 그대로 유지됩니다.

공개한 포스트 편집 권한이 없을 때 포스트 공개 후 프런트페이지의 해당 포스트를 바로 보여주는 것이 좋을 수 있습니다. 또, 공개한 포스트 편집 권한이 없다면 작성한 포스트를 프런트페이지에서 ‘미리보기(preview)’ 후 작성한 포스트를 확인 후 최종 공개하는 과정이 더 낫기에 임시 글로 저장했을 때도 프런트페이지로 이동하여 ‘미리보기’ 형태로 바로 보여주는 것 역시 회원제 사이트에서 검토할 수 있는 요소입니다. 이때 다음 훅을 사용하면 편리합니다.
redirect_post_location 훅
다음 코드를 기본으로 원하는 조건이나 저장 후 이동 위치(URL)를 정의할 수 있습니다.
add_filter( 'redirect_post_location', 'redirect_after_save_post', 10, 2 );
function redirect_after_save_post( $location, $post_id ) {
//
}
먼저, 포스트 저장 조건을 정의하기 위해 $_POST
변수가 전달하는 데이터를 알아봅니다. 다음 코드를 functions.php
등 코드를 추가할 수 있는 파일에 추가하고 저장합니다.
add_filter( 'redirect_post_location', 'redirect_after_save_post', 10, 2 );
function redirect_after_save_post( $location, $post_id ) {
echo '<pre>'.print_r($_POST, true).'</pre>';
}
새 포스트 작성 편집 화면에서 임의로 글을 입력하고 ‘임시 글로 저장’ 버튼을 클릭하면 다음의 데이터를 볼 수 있습니다. 일부만 나열하였고, ‘임시 글로 저장’한 예입니다.
Array
(
//
[save] => 임시 글로 저장
[wp-preview] =>
[hidden_post_status] => draft
[post_status] => draft
//
)
위의 데이터에서 확인할 것은 6번 줄과 9번 줄입니다. 6번 줄의 save
키만을 기준으로 정하면 넓은 조건으로 정의할 수 있습니다. 임시(draft) 또는 검토(pending) 상태 등 일부 포스트 상태에서는 모두 save
키가 존재합니다. ‘공개’ 또는 ‘비공개’로 저장하면 publish
키가 존재합니다. 다양한 상태로 저장하여 결과를 보면 금방 알 수 있습니다.
9번 줄 post_status
키와 데이터를 조건으로 정하면 조금 더 세부적인 조건을 정의할 수 있습니다. 앞에서 안내한 참고 링크의 워드프레스 포스트 상태마다 조건을 정의할 수 있다는 뜻입니다. 역시 다양한 상태로 저장하여 결과를 보고 사이트 운용 정책에 맞는 기준을 정하면 됩니다. 다음은 post_status
키와 데이터를 조건으로 정의한 것인데, ‘임시 글로 저장’한 예입니다.
add_filter( 'redirect_post_location', 'redirect_after_save_post', 10, 2 );
function redirect_after_save_post( $location, $post_id ) {
if ( isset( $_POST['post_status'] ) && $_POST['post_status'] == 'draft' ) {
echo '<pre>'.print_r($_POST, true).'</pre>';
}
}
이 포스트에서는 임시 글로 저장(draft), 공개(publish) 상태로 저장할 때 post_status
데이터를 조건으로 프런트 페이지에서 해당 포스트를 바로 볼 수 있도록 정의해봅니다.
get_preview_post_link 함수
다음은 임시 글로 저장(draft), 공개(publish) 상태로 포스트를 저장할 때 get_preview_post_link
함수를 사용하여 해당 포스트의 ‘미리보기’ 페이지로 이동하도록 정의한 것입니다.
add_filter( 'redirect_post_location', 'redirect_after_save_post', 10, 2 );
function redirect_after_save_post( $location, $post_id ) {
if (
isset( $_POST['post_status'] ) && $_POST['post_status'] == 'draft' ||
isset( $_POST['post_status'] ) && $_POST['post_status'] == 'publish'
) {
return get_preview_post_link( $post_id );
}
return $location;
}
앞의 코드 get_preview_post_link
함수는 포스트를 ‘공개’로 저장하면 미리보기 페이지가 아닌 실제 퍼머링크의 포스트 페이지로 이동합니다. 임시 글로 저장하면 미리보기 페이지로 이동합니다.
만약, get_preview_post_link
함수 대신 get_permalink
함수를 사용하고 임시 글로 저장하면 ‘워드프레스 기본 URL’ 구조로 포스트를 볼 수 있습니다. 직접 해보세요. 또, 해당 포스트가 아니라 다른 특정 페이지를 정의할 수도 있습니다.
다음은 워드프레스 기본 Subscriber 그룹과 포스트 타입이 post
일 때만 해당 코드가 적용되도록 정의한 것입니다.
add_filter( 'redirect_post_location', 'redirect_after_save_post', 10, 2 );
function redirect_after_save_post( $location, $post_id ) {
if ( current_user_can( 'subscriber' ) && get_post_type() == 'post' ) {
if (
isset( $_POST['post_status'] ) && $_POST['post_status'] == 'draft' ||
isset( $_POST['post_status'] ) && $_POST['post_status'] == 'publish'
) {
return get_preview_post_link( $post_id );
}
}
return $location;
}
회원제 사이트
워드프레스 회원제 사이트를 운용할 때 검토하여 설정해야 할 부분이 제법 많습니다. 물론, 그룹과 권한(Role & Capabilities)에 따른 워드프레스 기본 제공 방식을 그대로 사용한다면 신경 쓰지 않아도 됩니다. 기본을 변경할 때 가능하다면 워드프레스 방식 기준에 변경해야 조금 더 편리하면 안전합니다.