워드프레스 포스트 저장 후 특정 페이지로 이동

워드프레스 포스트 작성할 때 ‘검토(pending)’, ‘임시(draft)’, ‘공개(publish)’, ‘비공개(private)’ 등의 포스트 상태(post_status)를 선택하여 저장할 수 있습니다. 워드프레스 포스트 상태에 관한 정보는 다음을 참고할 수 있습니다.

Default Statuses

워드프레스의 기본은 포스트 저장 후 편집 화면을 다시 보여줍니다. 회원제 사이트에서 특정 그룹(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)에 따른 워드프레스 기본 제공 방식을 그대로 사용한다면 신경 쓰지 않아도 됩니다. 기본을 변경할 때 가능하다면 워드프레스 방식 기준에 변경해야 조금 더 편리하면 안전합니다.